package system.servlet;

import java.io.IOException;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;

import system.base.Customer;
import system.base.ProductCategory;
import system.base.Warehouse;
import system.base.WarehouseCategory;
import system.base.WarehouseCategoryRelation;

import com.apep.jwcs.service.AirSortReportExcel;
import com.apep.jwcs.service.AirSortReportService;
import com.hitrust.gs.bean.GSProductApepBean;
import com.hitrust.gs.bean.GSProviderBean;
import com.hitrust.gs.dao.GSMonthInfoDao;
import com.hitrust.gs.dao.GSProviderDAO;
import com.hitrust.gs.lib.GSAutoAuditongDateConfigurator;
import com.hitrust.gs.lib.GSBaseConstants;
import com.hitrust.gs.util.ResponseUtils;
import com.hitrust.gs.util.exception.GSException;

import framework.core.ConstDefine;
import framework.core.DBConnection;
import framework.core.DBEngine;
import framework.core.DBResult;
import framework.core.DateUtil;
import framework.core.LogWriter;
import framework.core.ObjectList;
import framework.core.SrvContext;
import framework.core.StringUtil;
import framework.core.UniversalRow;
import framework.core.UniversalTable;

public class ReportServletMSofWZ extends HttpServlet {
	private static final long serialVersionUID = 1;// 仅为不让本类出现警告 unnecessary
	private static final String IS_REPORT_PROCESSING = "isReportProcessing";

	public void init(ServletConfig aConfig) throws ServletException {
		super.init(aConfig);
	}

	// ==================================================报表1 开始
	/**
	 * 报表1调用 根据起始时间 得到入库单纪录中 符合条件的供应商列表
	 */
	public Vector detailqueryProviderGroup(String warehouseCode, String start,
			String end, String providerName, boolean needall,
			String balance_mode) {
		boolean provider = !providerName.equals("") && providerName != null;// 供应商是否存在
		String providertrue = "select code,name from t_provider where name = '"
				+ providerName + "'";
		String sqlStart = " select a.code,(select name from t_provider where t_provider.code = a.code) name from( ";
		String sqlInStart = " select " + " inhead.provider_code code, "
				+ " inhead.provider_name name " + " from "
				+ " t_in_head inhead, " + " t_in_sub insub " + " where "
				+ " inhead.in_bill_code = insub.in_bill_code " + " and "
				+ " inhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and insub.balance_mode = '" + balance_mode + "' " +

				" and " + " insub.status = '1' ";
		String sqlInEnd = " group by inhead.provider_code,inhead.provider_name ";
		String inneedallfalse = " and inhead.in_time >= '" + start + "' "
				+ " and " + " inhead.in_time <= '" + end + "' ";
		String inneedallTrue = " and " + " inhead.in_time <= '" + end + "' ";
		
		String sqlMonthStorage = "select per.code code,per.NAME"
        	+ " from t_month_storage mstorage,t_provider per"
        	+ " where mstorage.PROVIDER_CODE = per.CODE and mstorage.STATUS = 1"
            + " and mstorage.WAREHOUSE_CODE LIKE '"+ warehouseCode +"%'"
			+ " and mstorage.balance_mode = '"+balance_mode+"'";
		
	    int superMonth = Integer.parseInt(start.substring(5, 7)) - 1;
		int year = Integer.parseInt(start.substring(0, 4));
		if (superMonth == 0) {
			superMonth = 12;
			year = year - 1;
		}
		String dataMonth = "" + year + "-"
		+ (superMonth > 9 ? "" + superMonth : "0" + superMonth);
		String monthneedallTrue = " and mstorage.MONTH = '"+dataMonth+"'";
	    String sqlMonthEnd = " group by per.code,per.NAME";

				String sqlOutStart = " select " + " per.code code, "
				+ " per.name name " + " from " + " t_out_head outhead, "
				+ " t_out_sub outsub, " + " t_provider per " + " where "
				+ " outhead.out_bill_code = outsub.out_bill_code " + " and "
				+ " outhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and " + " outsub.status = '1' " + " and "
				+ " per.code = outsub.provider_code "
				+ " and outsub.balance_mode = '" + balance_mode + "' ";

		String sqlOutEnd = " group by per.code,per.name ";
		String outneedallfalse = " and outhead.out_time >= '" + start
				+ "' and outhead.out_time <= '" + end + "' ";

		String sqlEnd = " ) a group by code order by code ";
		String sql = "";
		if (needall) {// 需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart + inneedallfalse + sqlInEnd
						+ " union all " + sqlMonthStorage + monthneedallTrue
						+ sqlMonthEnd + sqlEnd;
			}
		} else {// 不需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart + inneedallfalse + sqlInEnd
						+ " union all " + sqlOutStart + outneedallfalse
						+ sqlOutEnd + sqlEnd;
			}
		}
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		DBResult dbrs = null;
		ResultSet row = null;
		Vector vec = new Vector();
		try {
			dbrs = DBEngine.doSelect(con, sql);
			row = dbrs.getRs();
			while (row.next()) {
				ProviderTemp pt = new ProviderTemp();
				pt.providerCode = row.getString(1);
				pt.ProviderName = row.getString(2);
				vec.add(pt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				row.close();
				dbrs.clear();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return vec;
	}
	
	public Vector detailqueryProviderRepair(String warehouseCode, String start,
			String end, String providerName, boolean needall,
			String balance_mode) {
		boolean provider = !providerName.equals("") && providerName != null;// 供应商是否存在
		String providertrue = "select code,name from t_provider where name = '"
				+ providerName + "'";
		String sqlStart = " select a.code,(select name from t_provider where t_provider.code = a.code) name from( ";
		String sqlInStart = " select " + " inhead.provider_code code, "
				+ " inhead.provider_name name " + " from "
				+ " t_in_head inhead, " + " t_in_sub insub " + " where "
				+ " inhead.in_bill_code = insub.in_bill_code " + " and "
				+ " inhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and insub.balance_mode = '" + balance_mode + "' " +

				" and " + " insub.status = '1' ";
		String sqlInEnd = " group by inhead.provider_code,inhead.provider_name ";
		String inneedallfalse = " and inhead.in_time >= '" + start + "' "
				+ " and " + " inhead.in_time <= '" + end + "' ";
		String inneedallTrue = " and " + " inhead.in_time <= '" + end + "' ";
		
		String sqlMonthStorage = "select per.code code,per.NAME"
        	+ " from t_month_storage mstorage,t_provider per,t_product_type wcr"
        	+ " where mstorage.PROVIDER_CODE = per.CODE and mstorage.product_id=wcr.product_id and wcr.type=12 and mstorage.STATUS = 1"
            + " and mstorage.WAREHOUSE_CODE LIKE '"+ warehouseCode +"%'"
			+ " and mstorage.balance_mode = '"+balance_mode+"'";
		
	    int superMonth = Integer.parseInt(start.substring(5, 7)) - 1;
		int year = Integer.parseInt(start.substring(0, 4));
		if (superMonth == 0) {
			superMonth = 12;
			year = year - 1;
		}
		String dataMonth = "" + year + "-"
		+ (superMonth > 9 ? "" + superMonth : "0" + superMonth);
		String monthneedallTrue = " and mstorage.MONTH = '"+dataMonth+"'";
	    String sqlMonthEnd = " group by per.code,per.NAME";

				String sqlOutStart = " select " + " per.code code, "
				+ " per.name name " + " from " + " t_out_head outhead, "
				+ " t_out_sub outsub, " + " t_provider per " + " where "
				+ " outhead.out_bill_code = outsub.out_bill_code " + " and "
				+ " outhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and " + " outsub.status = '1' " + " and "
				+ " per.code = outsub.provider_code "
				+ " and outsub.balance_mode = '" + balance_mode + "' ";

		String sqlOutEnd = " group by per.code,per.name ";
		String outneedallfalse = " and outhead.out_time >= '" + start
				+ "' and outhead.out_time <= '" + end + "' ";

		String sqlEnd = " ) a group by code order by code ";
		String sql = "";
		if (needall) {// 需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart + inneedallfalse + sqlInEnd
						+ " union all " + sqlMonthStorage + monthneedallTrue
						+ sqlMonthEnd + sqlEnd;
			}
		} else {// 不需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart + inneedallfalse + sqlInEnd
						+ " union all " + sqlOutStart + outneedallfalse
						+ sqlOutEnd + sqlEnd;
			}
		}
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		DBResult dbrs = null;
		ResultSet row = null;
		Vector vec = new Vector();
		try {
			dbrs = DBEngine.doSelect(con, sql);
			row = dbrs.getRs();
			while (row.next()) {
				ProviderTemp pt = new ProviderTemp();
				pt.providerCode = row.getString(1);
				pt.ProviderName = row.getString(2);
				vec.add(pt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				row.close();
				dbrs.clear();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return vec;
	}

	// ==================================================报表1 结束

	// ==================================================报表2 开始
	/**
	 * 被报表2调用 查询出库涉及到的客户
	 */
	public ObjectList detailquery2Group(String warehouseCode,
			String customerCode, String start, String end) {
		ObjectList mReturn = ObjectList.getList();
		String orgLimitCond2 = "";
		if (customerCode.equals("00")) {
			orgLimitCond2 = "1=1";
		} else {
			orgLimitCond2 = "substr(b.get_customer_code,1,"
					+ customerCode.length() + ") = " + customerCode;
		}

		String sql = "select b.get_customer_code cc from t_out_head a,t_out_sub b,t_customer c "
				+ "where b.status = '1' and a.id = b.out_bill_id and b.get_customer_code = c.code "
				+ "and a.warehouse_code like '"
				+ warehouseCode
				+ "%' and ("
				+ orgLimitCond2 + ")";
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "'";
		sql += " group by b.get_customer_code";
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();
		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery2Group error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {
			}
		}
		return mReturn;
	}

	/**
	 * 被报表2调用 查询产品出库金额
	 */
	public ObjectList detailquery2(String warehouseCode, String customerCode,
			String start, String end) {
		ObjectList mReturn = ObjectList.getList();
		String orgLimitCond2 = "";
		if (customerCode.equals("00")) {
			orgLimitCond2 = "1=1";
		} else {
			orgLimitCond2 = "substr(b.get_customer_code,1,"
					+ customerCode.length() + ") = " + customerCode;
		}
		String sql = "select c.code code,c.name name,b.product_money money "
				+ "from t_out_head a,t_out_sub b,t_customer c "
				+ "where b.status = '1' and a.id = b.out_bill_id and b.get_customer_code = c.code "
				+ "and a.warehouse_code like '" + warehouseCode + "%' and ("
				+ orgLimitCond2 + ")";
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "'";
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();

		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery2 error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {

			}
		}
		return mReturn;
	}

	// ==================================================报表2 结束

	// ==================================================报表4 开始
	public ObjectList detailquery4Group(String warehouseCode, String start,
			String end) {
		ObjectList mReturn = ObjectList.getList();
		String sql = "select "
				+ "d.code provider_code "
				+ "from "
				+ "t_out_head a,"
				+ "t_out_sub b,"
				+
				// "t_product c," +//修改供应商条件查询
				"t_provider d "
				+ "where "
				+ "b.status = 1 "
				+ "and a.id = b.out_bill_id "
				+
				// "and b.product_id = c.id " +
				// "and c.provider_code = d.code " + //修改供应商条件查询
				"and b.provider_code = d.code "
				+ // 修改供应商条件查询
				"and a.warehouse_code like '" + warehouseCode + "%' "
				+ "and b.balance_mode = '" + ConstDefine.getBalanceModeByFlag()
				+ "'";
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "'";
		sql += " group by d.code";
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();
		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery4Group error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {
			}
		}
		return mReturn;
	}

	public ObjectList detailquery4true(String warehouseCode, String start,
			String end) {
		ObjectList mReturn = ObjectList.getList();
		String sql = "select " + "d.name name," + "d.code code,";
		if (GSBaseConstants.PLANPRICE.equals("true")) {// 湖南巴士按实际价统计
			sql = sql + "b.product_count * b.actual_price money ";
		} else {
			sql = sql + "b.product_money money ";
		}
		sql = sql
				+ "from "
				+ "t_out_head a,"
				+ "t_out_sub b,"
				+ "t_product c,"
				+ // 修改供应商条件查询
				"t_provider d "
				+ "where "
				+ "b.status = 1 "
				+ "and a.id = b.out_bill_id "
				+ "and b.product_id = c.id "
				+ "and b.provider_code = d.code "
				+ "and a.warehouse_code like '"
				+ warehouseCode
				+ "%' "
				+ "and b.balance_mode = '"
				+ ConstDefine.getBalanceModeByFlag()
				+ "' and (c.IS_TRADEFLAT_PRODUCT = '1' or c.IS_TRADEFLAT_PRODUCT = '0') ";
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "'";
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();
		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery4 error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {

			}
		}
		return mReturn;
	}

	public ObjectList detailquery4false(String warehouseCode, String start,
			String end) {
		ObjectList mReturn = ObjectList.getList();
		String sql = "select " + "d.name name," + "d.code code,";
		if (GSBaseConstants.PLANPRICE.equals("true")) {// 湖南巴士按实际价统计
			sql = sql + "b.product_count * b.actual_price money ";
		} else {
			sql = sql + "b.product_money money ";
		}

		sql = sql
				+ "from "
				+ "t_out_head a,"
				+ "t_out_sub b,"
				+ "t_product c,"
				+ // 修改供应商条件查询
				"t_provider d " + "where " + "b.status = 1 "
				+ "and a.id = b.out_bill_id "
				+ "and b.product_id = c.id "
				+ "and b.provider_code = d.code "
				+ // 修改供应商条件查询
				"and a.warehouse_code like '" + warehouseCode + "%' "
				+ "and b.balance_mode = '" + ConstDefine.getBalanceModeByFlag()
				+ "' and c.IS_TRADEFLAT_PRODUCT = '2'";
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "'";

		DBConnection con = null;

		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();

		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery4 error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {

			}
		}

		return mReturn;
	}

	// ==================================================报表4 结束

	// ==================================================报表6 开始
	public ObjectList detailquery6Group(String warehouseCode,
			String inCustomerName, String getCustomers, String start, String end) {

		ObjectList mReturn = ObjectList.getList();
		String cusLimit = "";
		if ("".equals(getCustomers)) {
			cusLimit = "1=1";
		} else {
			cusLimit = "b.get_customer_code in (" + getCustomers + ")";
		}

		String sql = "select b.product_code code from t_out_head a,t_out_sub b,t_product c,t_customer d "
				+ "where a.id = b.out_bill_id and b.product_code = c.concentricity_code and a.customer_code = d.code "
				+ "and a.warehouse_code like '"
				+ warehouseCode
				+ "%'"
				+ "and d.name = '" + inCustomerName + "' and " + cusLimit;
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "' ";
		sql += "group by b.product_code";

		DBConnection con = null;

		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();

		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery6Group error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {

			}
		}

		return mReturn;
	}

	public ObjectList detailquery6All(String warehouseCode,
			String inCustomerName, String getCustomers, String start, String end) {

		ObjectList mReturn = ObjectList.getList();
		String cusLimit = "";
		if ("".equals(getCustomers)) {
			cusLimit = "1=1";
		} else {
			cusLimit = "b.get_customer_code in (" + getCustomers + ")";
		}
		String sql = "select b.product_code concentricity_code,c.apep_code apep_code,c.name name,c.spec spec,b.product_price price, "
				+ "b.product_count count,b.product_money money "
				+ "from t_out_head a,t_out_sub b,t_product c,t_customer d "
				+ "where a.id = b.out_bill_id and b.product_code = c.concentricity_code and a.customer_code = d.code "
				+ "and a.warehouse_code like '"
				+ warehouseCode
				+ "%'"
				+ "and d.name = '" + inCustomerName + "' and " + cusLimit;
		sql += " and a.out_time >= '" + start + "' and a.out_time <= '" + end
				+ "'";
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
			UniversalTable ut = new UniversalTable();
			ut.initial(con, sql);
			mReturn = ut.getList();
		} catch (Exception e) {
			System.out.println("ReportServlet SQL detailquery6All error:"
					+ e.getMessage());
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (Exception e1) {

			}
		}

		return mReturn;
	}

	// ==================================================报表6 结束

	/** 开始执行报表 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
		if (!isProcessContinue(request, response)) {
			return;
		}

		HttpSession session = request.getSession();
		session.setAttribute(IS_REPORT_PROCESSING, Boolean.TRUE);

		System.out.println("**ReportServlet start**");
		/** 时间拼接 开始************************************************** */
		String tDateString = new DateUtil().getFullString();
		String tYear = tDateString.substring(0, 4);
		String tMonth = tDateString.substring(5, 7);
		String tDate = tDateString.substring(8, 10);
		String tHour = tDateString.substring(11, 13);
		String tMin = tDateString.substring(14, 16);
		String tSec = tDateString.substring(17, 19);
		String fileName = "GW_REPORT_" + tYear + "_" + tMonth + "_" + tDate
				+ "_" + tHour + "_" + tMin + "_" + tSec;
		/** 时间拼接 结束************************************************** */

		/** 基础变量设置 开始************************************************* */
		String providerName = ""; // 供应商名称
		String inCustomerName = ""; // 供货单位名称
		String customerCode = ""; // 领料单位编码
		// String warehouseProduct = ""; //报表分类 此变量 使用地不明确 暂注释
		String getCustomers = "";// 领料单位
		String title = request.getParameter("title");
		String warehouseCode = ""; // 仓库编码
		String start = ""; // 查询起始时间
		String end = ""; // 查询终止时间
		String needAll = "";// 查询所有的纪录
		/** 基础变量设置 结束************************************************* */

		/**
		 * title : 1.压库产品进、销、存报表 2.领用报表 3.压库产品进、销、存资金汇总月报 4.压库产品应付款月报
		 * 5.买断产品资金进出累计汇总（成本价） 6.合并库收料清单（修理公司） 7.压库产品分类月进出明细
		 * 8.买断产品资金进出累计汇总(账本分类统计) 10.买断产品进销存报表（因为9被用掉了） 16.空调报表(11-15下面有被用掉)
		 * 18.产品进销存供应商分类报表,19供应商结算分类明细报表，20，供应商结算分类总汇报表
		 */
		/** 压库产品进销存报表 对供应商参数进行判断 开始 */
		if ("1".equals(title) || "10".equals(title) || "18".equals(title)||"19".equals(title)) {
			if (!"".equals(request.getParameter("providerName"))
					&& request.getParameter("providerName") != null) {
				try {
					providerName = request.getParameter("providerName");
					providerName = SrvContext.fixString(providerName);
				} catch (Exception e) {
					providerName = "";
				}
			} else {
				providerName = "";
			}
			needAll = request.getParameter("needAll");
		}
		/** 压库产品进销存报表 对供应商参数进行判断 结束 */
		else if ("2".equals(title)) {
			customerCode = request.getParameter("customerCode");
		} else if ("5".equals(title)) {
			if (!"".equals(request.getParameter("warehouseProduct"))
					&& request.getParameter("warehouseProduct") != null) {
				// warehouseProduct = request.getParameter("warehouseProduct");
			} else {
				// warehouseProduct = "";
			}
		} else if ("6".equals(title)) {
			try {
				inCustomerName = request.getParameter("customerName");
				inCustomerName = SrvContext.fixString(inCustomerName);
			} catch (Exception e) {
				inCustomerName = "";
			}
			if (!"".equals(request.getParameter("getCustomer"))
					&& request.getParameter("getCustomer") != null) {
				getCustomers = request.getParameter("getCustomer");
			}
		} else if ("8".equals(title)) {
			if (!"".equals(request.getParameter("warehouseProduct"))
					&& request.getParameter("warehouseProduct") != null) {
				// warehouseProduct = request.getParameter("warehouseProduct");
			} else {
				// warehouseProduct = "";
			}
		}

		if (!"".equals(request.getParameter("warehouseCode"))
				&& request.getParameter("warehouseCode") != null) {
			warehouseCode = request.getParameter("warehouseCode");
		}
		String querytype = request.getParameter("querytype");
		String month = "";
		/** 压库产品进销存报表 对查询时间段进行判断 开始 */
		int sYear = 0;
		int sMonth = 0;
		if ("1".equals(querytype)) {
			String yearMonth = request.getParameter("begindate") + "-"
					+ request.getParameter("enddate");
			sYear = Integer.parseInt(request.getParameter("begindate").trim());
			sMonth = Integer.parseInt(request.getParameter("enddate").trim());
			int sDate = 31; // 每月的默认天数
			try {
				sDate = DateUtil.getMaxDayOfMonth(sYear, sMonth);
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
			start = yearMonth + "-01";
			end = yearMonth + "-" + String.valueOf(sDate);
			if (String.valueOf(sMonth - 1).length() < 2) {
				month = String.valueOf(sYear) + "0"
						+ String.valueOf(sMonth - 1);
			} else {
				month = String.valueOf(sYear + sMonth);
			}
		} else {
			start = request.getParameter("begindate");
			if ("".equals(request.getParameter("enddate"))) {
				end = new framework.core.DateUtil().getDateString();
			} else {
				end = request.getParameter("enddate");
			}
			int tmpMonth = Integer.parseInt(start.substring(6, 7)) - 1;

			if (String.valueOf(tmpMonth).length() < 2) {
				month = start.substring(0, 4);
				month += "0" + String.valueOf(tmpMonth);
			} else {
				month = start.substring(0, 4);
				month += String.valueOf(tmpMonth);
			}
		}

		/** 压库产品进销存报表 对查询时间段进行判断 结束 */
		String before_end = "";
//		start += " 00:00:00";
//		end += " 23:59:59";

		String endHour = null;//带时间点的期初计算
		if(start.length()<=10){
			start += " 00:00:00";
		}else{
			endHour =  start.substring(10,start.length() );
		}
		if(end.length()<=10){
			end += " 23:59:59";
		}else{
			endHour =  start.substring(10,start.length() );
		}

		before_end = start;
		String title1 = ""; // 表头
		String warehouseName = ""; // 仓库名称
		ObjectList warehouseList =ObjectList.getList();
		try {
			DBConnection con = null;
			con = DBConnection.open(false);
			warehouseName = Warehouse.fetchByCode(con, warehouseCode).getName();
			if(warehouseCode.length()==8){
				warehouseList = Warehouse.fetchWarehouses(con, warehouseCode);
			}
			con.close();
		} catch (Exception e2) {
			System.out.println(e2.getMessage());
		}
		String startType2 = "";//按日期查时 起始时间
		String endType2 = "";
		boolean isType2= false;//如果是选择日期
		int startDay = Integer.parseInt(start.substring(8, 10));
		
		GSMonthInfoDao gmi = new GSMonthInfoDao();
		int superMonth = Integer.parseInt(start.substring(5, 7)) - 1;
		int year = Integer.parseInt(start.substring(0, 4));
		if (superMonth == 0) {
			superMonth = 12;
			year = year - 1;
		}
		String dataMonth = "" + year + "-"
				+ (superMonth > 9 ? "" + superMonth : "0" + superMonth);
		String nextMonth = "" + year + "-"+ start.substring(5, 7) ;
		
		if (gmi.selectMonthInfoByMonth(dataMonth, warehouseCode)) {
			isMonthStorage(request, response, title, dataMonth);
			return;
		} else {
			boolean isServicCompany = false;
			List times = null;
			//判断是否为运营公司级别
			if(warehouseCode.length()==6|| (warehouseCode.length()==8&&warehouseList.size()>1) ){
				times = gmi.selectMonthInfoTimeForServiceCompany(dataMonth, warehouseCode);
				if (times == null || times.size()==0) {
					errorMessage(request, response, title, "没有月结的起始时间");
					return;
				}
				isServicCompany = true;
				try {
					DBConnection con = null;
					con = DBConnection.open(false);
					ObjectList warehouseObjectList = Warehouse.fetchWarehouses(con, warehouseCode);
					if((warehouseObjectList.size()-1)!= (times.size()>2?times.size()/2:times.size())){
						for (int i = 0; i < warehouseObjectList.size(); i++) {
							Warehouse warehouse = (Warehouse) warehouseObjectList.get(i);
							if(warehouse.getCode().length()>6){
								if (!"新新漕宝仓库".equals(warehouse.getName())&&!"普陀仓库".equals(warehouse.getName())&&!"石龙仓库".equals(warehouse.getName())&&!"0000040100".equals(warehouse.getCode())&&!"0000040001".equals(warehouse.getCode())&&!"0000040000".equals(warehouse.getCode())) {
									times = gmi.selectMonthInfoTimeForServiceCompany(dataMonth, warehouse.getCode());
									if(times == null || times.size()==0){
										errorMessage(request, response, title, warehouseName+"中:"+warehouse.getName()+"未进行月结!");
										return;
									}
									
								}
							}
						}
					}
					con.close();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
			}else{	
				times = gmi.selectMonthInfoTime(dataMonth, warehouseCode);
				if (times == null) {
					errorMessage(request, response, title, "没有月结的起始时间");
					return;
				}
			}
			
			String timeStart = "";
			String timeEnd = "";
			//TODO 目前直接以运营公司下的第一个仓库为依据，以后可能有修改
			if(isServicCompany){
				for (int i = 0; i < times.size(); i++) {
					if((i*2)>times.size()||(i*2+1)>times.size()||(i*2+2)>times.size()||(i*2+3)>times.size()){
						break;
					}
					String firstStartTime = (String) times.get(i*2);
					String firstEndTime =(String) times.get(i*2+1);
					String nextStartTime = (String) times.get(i*2+2);
					String nextEndTime = (String) times.get(i*2+3);
					if(!((firstStartTime.equals(nextStartTime))&& firstEndTime.equals(nextEndTime))){
						errorMessage(request, response, title, "各仓库自然月与非自然月不一致，功能未实现");
						return;
					}
				}
				timeStart = (String) times.get(0);
				timeEnd = (String) times.get(1);
			}else{
				timeStart = (String) times.get(0);
				timeEnd = (String) times.get(1);
			}
			
			//判断是自然月还是非自然月
			int startMonth = Integer.parseInt(timeStart.substring(5, 7));	
			int endMonth = Integer.parseInt(timeEnd.substring(5, 7)) ;
			if(querytype.equals("1")){	
				if(startMonth!=endMonth){
					if(startMonth ==12){
						startMonth=1;
						timeStart = (Integer.parseInt(timeStart.substring(0, 4))+1)+"-"
						+ (startMonth > 9 ? "" + startMonth : "0" + startMonth)
						+ timeStart.substring(7, timeStart.length());
					}else{
						startMonth+=1;
						timeStart = timeStart.substring(0, 5)
						+ (startMonth > 9 ? "" + startMonth : "0" + startMonth)
						+ timeStart.substring(7, timeStart.length());
					}	
					if(endMonth ==12){
						endMonth=1;
						timeEnd = (Integer.parseInt(timeEnd.substring(0, 4))+1)+"-"
							+ (endMonth > 9 ? "" + endMonth : "0" + endMonth)
							+ timeEnd.substring(7, timeEnd.length());
					}else{
						endMonth+=1;
					    timeEnd = timeEnd.substring(0, 5)
							+ (endMonth > 9 ? "" + endMonth : "0" + endMonth)
							+ timeEnd.substring(7, timeEnd.length());
					}
					
					start=timeStart;
					end = timeEnd;
				 }
			}
			int typ2EndDay = Integer.parseInt(timeEnd.substring(8, 10));
		
			if(querytype.equals("2")){	
				
				if(startMonth==endMonth){
					startDay-=1;
					if(startDay>0){
						
						if(startMonth == 12){
							startMonth = 1;
							startType2 = (Integer.parseInt(timeEnd.substring(0, 4))+1)+"-"
							+ (startMonth > 9 ? "" + startMonth : "0" + startMonth)
							+ timeStart.substring(7, timeStart.length());
							//TODO
							int endHourToEnd=0;
							int endHourTo = 0;
							String endHourToString="";
							if(endHour!=null){
								endHourTo = Integer.parseInt(endHour.trim().substring(0,2));
								endHourToEnd = endHourTo==0?23:endHourTo-1;
								endHourToString += endHourToEnd>9?""+endHourToEnd:"0"+endHourToEnd;
								endHourToString = " "+endHourToString+":59:59";
							}
							if(endHour!=null&&endHourTo!=0){
								startDay++;
							}
							endType2 = startType2.substring(0,8)+(startDay > 9 ? "" + startDay : "0" + startDay);
							endType2 +=endHour==null?" 23:59:59":endHourToString;
							isType2=true;
						}else{
							startMonth+=1;
							startType2 = timeEnd.substring(0, 5)
							+ (startMonth > 9 ? "" + startMonth : "0" + startMonth)
							+ timeStart.substring(7, timeStart.length());
							int endHourToEnd=0;
							int endHourTo=0;
							String endHourToString="";
							if(endHour!=null){
								endHourTo = Integer.parseInt(endHour.trim().substring(0,2));
								endHourToEnd = endHourTo==0?23:endHourTo-1;
								endHourToString += endHourToEnd>9?""+endHourToEnd:"0"+endHourToEnd;
								endHourToString = " "+endHourToString+":59:59";
							}
							if(endHour!=null&&endHourTo!=0){
								startDay++;
							}
							endType2 = startType2.substring(0,8)+(startDay > 9 ? "" + startDay : "0" + startDay);
							endType2+=endHour==null?" 23:59:59":endHourToString;
							isType2=true;
						}
						
					}else if(startDay==0&&endHour!=null&&!endHour.substring(1, 3).equals("00")){
						if(startMonth == 12){
							startMonth = 1;
							startType2 = (Integer.parseInt(timeEnd.substring(0, 4))+1)+"-"
							+ (startMonth > 9 ? "" + startMonth : "0" + startMonth)
							+ timeStart.substring(7, timeStart.length());
							//TODO
							int newStartDay = startDay+1;
							
							endType2 = startType2.substring(0,8)+(newStartDay > 9 ? "" + newStartDay : "0" + newStartDay);
							int endHourToEnd=0;
							int endHourTo = Integer.parseInt(endHour.trim().substring(0,2));
							endHourToEnd = endHourTo==0?23:endHourTo-1;
							String endHourToString="";
							endHourToString += endHourToEnd>9?""+endHourToEnd:"0"+endHourToEnd;
							endHourToString = " "+endHourToString+":59:59";
							endType2 +=endHour==null?" 23:59:59":endHourToString;
							isType2=true;
						}else{
							startMonth+=1;
							startType2 = timeEnd.substring(0, 5)
							+ (startMonth > 9 ? "" + startMonth : "0" + startMonth)
							+ timeStart.substring(7, timeStart.length());
							int newStartDay = startDay+1;
							endType2 = startType2.substring(0,8)+(newStartDay > 9 ? "" + newStartDay : "0" + newStartDay);
							int endHourTo = Integer.parseInt(endHour.trim().substring(0,2));
							String endHourToString="";
							int endHourToEnd=0;
							endHourToEnd = endHourTo==0?23:endHourTo-1;
							endHourToString += endHourToEnd>9?""+endHourToEnd:"0"+endHourToEnd;
							endHourToString = " "+endHourToString+":59:59";
							
							endType2+=endHour==null?" 23:59:59":endHourToString;
							isType2=true;
						}
					}
	
				}else{
				 if(startDay==(typ2EndDay-1)){
					dataMonth=nextMonth;
					if (gmi.selectMonthInfoByMonth(dataMonth, warehouseCode)) {
						isMonthStorage(request, response, title, dataMonth);
						return;
					} 
					isType2=false;
				 }else if(startDay<typ2EndDay){
						startDay-=1;
						String day = "";
						if(startDay==0){
							day =start;
							if(day.equals("01")){
								day=""+(Integer.parseInt(start.substring(0, 4))-1)+"-12-";
							}else{
								int m =Integer.parseInt(start.substring(5, 7))-1;
								day=""+(Integer.parseInt(start.substring(0, 4)))+"-"+(m>9?""+m:"0"+m)+"-";
							}
							startDay = getMaxDay(day);
							day += startDay;
						}
						typ2EndDay+=1;
						startType2 = timeEnd.substring(0,8)+(typ2EndDay > 9 ? "" + typ2EndDay : "0" + typ2EndDay)+ " 00:00:00";;
//						endType2 = (day.equals("")?start.substring(0,8)+(startDay > 9 ? "" + startDay : "0" + startDay):day);
//						endType2+=endHour==null?" 23:59:59":endHour;
						
						if(endHour==null){
							endType2 = start.substring(0,8)+(startDay > 9 ? "" + startDay : "0" + startDay)+" 23:59:59";
						}else{
							errorMessage(request, response, title, "按小时的非自然月查询，功能未实现");
							return;
						}
						isType2=true;	
					
					}else if(startDay>typ2EndDay){
						superMonth+=1;
						 dataMonth = "" + year + "-"
						+ (superMonth > 9 ? "" + superMonth : "0" + superMonth);
						if (gmi.selectMonthInfoByMonth(dataMonth, warehouseCode)) {
							if(endHour!=null){
								errorMessage(request, response, title, "按小时的非自然月查询，功能未实现");
								return;
							}
							isMonthStorage(request, response, title, dataMonth);	
							return;
						} else {
							if(isServicCompany){
								times = gmi.selectMonthInfoTimeForServiceCompany(dataMonth, warehouseCode);
							}else{
								times = gmi.selectMonthInfoTime(dataMonth, warehouseCode);
							}
							if (times == null) {
								errorMessage(request, response, title, "没有月结的起始时间");
								return;
							}
							timeStart = (String) times.get(0);
							timeEnd = (String) times.get(1);
							typ2EndDay+=1;
							startMonth+=1;
							startDay-=1;
							if(startDay==0){
								String day =start;
								if(day.substring(5, 7).equals("01")){
									day=""+(Integer.parseInt(start.substring(0, 4))-1)+"-12-";
								}else{
									int m =Integer.parseInt(start.substring(5, 7))-1;
									day=""+(Integer.parseInt(start.substring(0, 4)))+"-"+(m>9?""+m:"0"+m)+"-";
								}
								startDay = getMaxDay(day);
							}
							startType2 = timeEnd.substring(0,8)+(typ2EndDay > 9 ? "" + typ2EndDay : "0" + typ2EndDay)+ " 00:00:00";;
//							endType2 = start.substring(0,8)+(startDay > 9 ? "" + startDay : "0" + startDay);
							if(endHour==null){
								endType2 = start.substring(0,8)+(startDay > 9 ? "" + startDay : "0" + startDay)+" 23:59:59";
							}else{
								errorMessage(request, response, title, "按小时的非自然月查询，功能未实现");
								return;
							}
							isType2=true;	
					    	}

						}else if(startDay==typ2EndDay&&endHour!=null){
							errorMessage(request, response, title, "按小时的非自然月查询，功能未实现");
							return;
						}
					}  
				
			}
	}

		LogWriter.info("月结开始" + start + "至" + end);
		boolean isAvaliable = true;// 是否保存成功
		boolean isLager = false;// 是否数据过多

		/**
		 * 压库产品进销存 数据提取 开始 (9是新的查询逻辑,不同之处是月结的查询) (10是买断产品进销存) (16是空调报表)
		 * 17是按集团分类进销存报表)
		 */
		if ("17".equals(title)) {
			String balance_mode = request.getParameter("balanceMode");
			String position = request.getParameter("positionCode");
			List warehouesList = new ArrayList();

			warehouesList = WarehouseCategory.getWarehouseCode(warehouseCode);
			int size = 0;
			if (warehouesList != null && warehouesList.size() > 0) {
				size = warehouesList.size();
			}
			int totalSize = 0;
			DBConnection con = null;
			DBResult dbrs = null;
			java.sql.ResultSet rs = null;
			List fullList = new ArrayList();
			try {
				con = DBConnection.open(false);
				for (int i = 0; i < size; i++) {
					String[] currentWarehouseCode = (String[]) warehouesList
							.get(i);
					String sql = "SELECT   aa1.category_code, aa1.upper_category, aa1.name,"
							+ " SUM (aa1.init_count) init_count, SUM (aa1.init_money) init_money, "
							+ " SUM (aa1.in_count) in_count, SUM (aa1.in_money) in_money, "
							+ " SUM (aa1.in_1002money) in_1002money, "
							+ " SUM (aa1.in_money) + SUM (aa1.in_1002money) in_moneys, "
							+ " SUM (aa1.out_count) out_count, SUM (aa1.out_money) out_money, "
							+ " SUM (aa1.out_2002money) out_2002money, "
							+ " SUM (aa1.out_money) + SUM (aa1.out_2002money) out_moneys, "
							+ "  SUM (aa1.init_count) "
							+ " + SUM (aa1.in_count) "
							+ " - SUM (aa1.out_count) final_count, "
							+ "   SUM (aa1.init_money) "
							+ " + SUM (aa1.in_money) "
							+ " + SUM (aa1.in_1002money) "
							+ " - SUM (aa1.out_money) "
							+ " - SUM (aa1.out_2002money) final_money "
							+ " FROM (SELECT   wcr.category_code, wc.upper_category, "
							+ " wc.name, 0 init_count, 0 init_money, "
							+ " SUM (ms.product_count) in_count, "
							+ " SUM (ms.product_money) in_money, "
							+ " 0 in_1002money, 0 out_count, 0 out_money, "
							+ " 0 out_2002money "
							+ " FROM t_month_storage ms "
							+ " LEFT OUTER JOIN t_product wcr "
							+ " ON UPPER (ms.product_code) = "
							+ " UPPER (wcr.concentricity_code) "
							+ " LEFT OUTER JOIN t_product_category wc "
							+ " ON wcr.category_code = wc.code "
							+ " WHERE 1 = 1 "
							+ " AND ms.warehouse_code like '"
							+ currentWarehouseCode[0]
							+ "%' "
							+ " AND ms.month = '"
							+ dataMonth
							+ "' "
							+ " AND ms.status = '1' ";
					if (balance_mode != null
							&& balance_mode.trim().length() > 0) {
						sql += " and ms.balance_mode = '" + balance_mode.trim()
								+ "' ";
					}
					if (position != null && position.trim().length() > 0) {
						sql += " and ms.position_code = '" + position.trim()
								+ "' ";
					}

					sql += " GROUP BY wc.upper_category, "
							+ " wcr.category_code, "
							+ " wc.name  "
							+ "UNION ALL "
							+ "SELECT a1.category_code, a1.upper_category, a1.name, "
							+ " 0 init_count, 0 init_money, a1.in_count, a1.in_money, "
							+ "a1.in_1002money, 0 out_count, 0 out_money, 0 out_2002money "
							+ "FROM (SELECT   wcr.category_code, wc.upper_category, "
							+ " wc.name, "
							+ " SUM (insub.product_count) in_count, "
							+ " SUM (insub.product_money) in_money, 0 in_1002money "
							+ " FROM t_in_sub insub LEFT OUTER JOIN t_in_head inhead "
							+ "ON insub.in_bill_id = inhead.ID "
							+ "LEFT OUTER JOIN t_product wcr "
							+ "ON UPPER (insub.product_code) = "
							+ "  UPPER (wcr.concentricity_code) "
							+ "LEFT OUTER JOIN t_product_category wc "
							+ "ON wcr.category_code = wc.code "
							+ "   WHERE 1 = 1 "
							+ "AND inhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ "AND inhead.in_time >= '" + start + "' "
							+ "AND inhead.in_time <= '" + end + "' "
							+ "AND insub.create_time >= '" + start + "' "
							+ "AND insub.create_time <= '" + end + "' "
							+ "AND inhead.in_type = '1001' "
							+ "AND insub.status = '1' ";
					if (balance_mode != null
							&& balance_mode.trim().length() > 0) {
						sql += " and insub.balance_mode = '"
								+ balance_mode.trim() + "' ";
					}
					if (position != null && position.trim().length() > 0) {
						sql += " and insub.position_code = '" + position.trim()
								+ "' ";
					}
					sql += "GROUP BY wc.upper_category,"
							+ "wcr.category_code, "
							+ "wc.name "
							+ "UNION "
							+ "SELECT   wcr.category_code, wc.upper_category, "
							+ "wc.name, "
							+ "SUM (insub.product_count) in_count, 0 in_money, "
							+ "SUM (insub.product_money) in_1002money "
							+ "    FROM t_in_sub insub LEFT OUTER JOIN t_in_head inhead "
							+ "ON insub.in_bill_id = inhead.ID "
							+ "LEFT OUTER JOIN t_product wcr "
							+ "ON UPPER (insub.product_code) = "
							+ "  UPPER (wcr.concentricity_code) "
							+ "LEFT OUTER JOIN t_product_category wc "
							+ "ON wcr.category_code = wc.code "
							+ "   WHERE 1 = 1 "
							+ "AND inhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ "AND inhead.in_time >= '" + start + "' "
							+ "AND inhead.in_time <= '" + end + "' "
							+ "AND insub.create_time >= '" + start + "' "
							+ "AND insub.create_time <= '" + end + "' "
							+ "AND inhead.in_type = '1002' "
							+ "AND insub.status = '1' ";
					if (balance_mode != null
							&& balance_mode.trim().length() > 0) {
						sql += " and insub.balance_mode = '"
								+ balance_mode.trim() + "' ";
					}
					if (position != null && position.trim().length() > 0) {
						sql += " and insub.position_code = '" + position.trim()
								+ "' ";
					}
					sql += "GROUP BY wc.upper_category, "
							+ "wcr.category_code, "
							+ "wc.name) a1 "
							+ "   UNION ALL "
							+ "   SELECT a2.category_code, a2.upper_category, a2.name, "
							+ "0 init_count, 0 init_money, 0 in_count, 0 in_money, "
							+ "0 in_1002money, a2.out_count, a2.out_money, a2.out_1002money "
							+ "FROM (SELECT   wcr.category_code, wc.upper_category, "
							+ "wc.name, "
							+ "SUM (outsub.product_count) out_count, "
							+ "SUM (outsub.product_money) out_money, "
							+ "0 out_1002money "
							+ "    FROM t_out_sub outsub LEFT OUTER JOIN t_out_head outhead "
							+ "ON outsub.out_bill_id = outhead.ID  "
							+ "LEFT OUTER JOIN t_product wcr "
							+ "ON UPPER (outsub.product_code) = "
							+ "  UPPER (wcr.concentricity_code) "
							+ "LEFT OUTER JOIN t_product_category wc "
							+ "ON wcr.category_code = wc.code "
							+ "   WHERE 1 = 1 "
							+ "AND outhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ "AND outhead.out_time >= '" + start + "' "
							+ "AND outhead.out_time <= '" + end + "' "
							+ "AND outsub.create_time >= '" + start + "' "
							+ "AND outsub.create_time <= '" + end + "' "
							+ "AND outhead.out_type = '2001' "
							+ "AND outsub.status = '1' ";
					if (balance_mode != null
							&& balance_mode.trim().length() > 0) {
						sql += " and outsub.balance_mode = '"
								+ balance_mode.trim() + "' ";
					}
					if (position != null && position.trim().length() > 0) {
						sql += " and outsub.position_code = '"
								+ position.trim() + "' ";
					}
					sql += "GROUP BY wc.upper_category, "
							+ "   wcr.category_code, "
							+ "wc.name "
							+ "UNION ALL "
							+ "SELECT   wcr.category_code, wc.upper_category, "
							+ "wc.name, "
							+ "SUM (outsub.product_count) out_count, 0 out_money, "
							+ "SUM (out_money) out_1002money "
							+ "    FROM t_out_sub outsub LEFT OUTER JOIN t_out_head outhead "
							+ "ON outsub.out_bill_id = outhead.ID "
							+ "LEFT OUTER JOIN t_product wcr "
							+ "ON UPPER (outsub.product_code) = "
							+ "  UPPER (wcr.concentricity_code) "
							+ "LEFT OUTER JOIN t_product_category wc "
							+ "ON wcr.category_code = wc.code "
							+ "   WHERE 1 = 1 "
							+ "AND outhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ "AND outhead.out_time >= '" + start + "' "
							+ "AND outhead.out_time <= '" + end + "' "
							+ "AND outsub.create_time >= '" + start + "' "
							+ "AND outsub.create_time <= '" + end + "' "
							+ "AND outhead.out_type = '2002' "
							+ "AND outsub.status = '1' ";
					if (balance_mode != null
							&& balance_mode.trim().length() > 0) {
						sql += " and outsub.balance_mode = '"
								+ balance_mode.trim() + "' ";
					}
					if (position != null && position.trim().length() > 0) {
						sql += " and outsub.position_code = '"
								+ position.trim() + "' ";
					}
					sql += "GROUP BY wc.upper_category, "
							+ "wcr.category_code, " + " wc.name) a2) aa1 "
							+ " GROUP BY upper_category, category_code, name "
							+ "  ORDER BY upper_category, category_code";
					List vec = new ArrayList();
					dbrs = DBEngine.doSelect(con, sql);
					rs = dbrs.getRs();
					vec.add(currentWarehouseCode);
					while (rs.next()) {
						totalSize++;
						String[] values = new String[15];
						values[0] = rs.getString("category_code");
						values[1] = rs.getString("init_count");
						values[2] = rs.getString("init_money");
						values[3] = rs.getString("in_count");
						values[4] = rs.getString("in_money");
						values[5] = rs.getString("in_1002money");
						values[6] = rs.getString("in_moneys");
						values[7] = rs.getString("out_count");
						values[8] = rs.getString("out_money");
						values[9] = rs.getString("out_2002money");
						values[10] = rs.getString("out_moneys");
						values[11] = rs.getString("final_count");
						values[12] = rs.getString("final_money");
						values[13] = rs.getString("upper_category") == null ? ""
								: rs.getString("upper_category");
						values[14] = rs.getString("name");
						vec.add(values);
					}
					fullList.add(vec);
				}
			} catch (Exception e2) {
				LogWriter.error(e2.getMessage());
				System.out.println(e2.getMessage());
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
					if (dbrs != null) {
						dbrs.clear();
					}
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (warehouesList == null) {
				isAvaliable = false;
			} else if (totalSize > 13000) {
				isAvaliable = false;
				isLager = true;
			} else {
				writeExcel_ReportPCMoneyInout(fullList, month, warehouseCode,
						fileName, start, end, request, response);
			}

		}

		else if ("16".equals(title)) {
			AirSortReportService airSortReportService = new AirSortReportService();
			try {
				Map airSortMap = airSortReportService.getAirSortReportMap(
						warehouseCode, start, end);
				writeExcel_ReportAirSort(airSortMap, warehouseName, month,
						"空调消耗报表", warehouseCode, fileName, start, end, request,
						response);
			} catch (GSException e) {
				e.printStackTrace();
			}
		} else if ("1".equals(title) || "9".equals(title) || "10".equals(title)
				|| "18".equals(title)||"19".equals(title)) {
			String masterStart = "";
			String masterEnd = "";
			String masterPart1Start = "";
			String masterPart1End = "";
			String in = "";
			String out = "";
			String newMonthStorage = "";
			Vector vec2 = new Vector();
			String balance_mode = request.getParameter("balanceMode");
			String position = request.getParameter("positionCode");
			if (GSBaseConstants.PLANPRICE.equals("true")) {
				title1 = warehouseName + "仓库产品进、销、存报表";
			} else {
				if (balance_mode.equals("2")) {
					title1 = warehouseName + "仓库产品买断进、销、存报表";
				}else if ("18".equals(title)) {
					title1 = warehouseName + "仓库产品进、销、存供应商分类报表";
				}else if("19".equals(title)){
					title1 = warehouseName + "仓库供应商结算分类明细报表";
			    }else if (balance_mode.equals("1")){
					title1 = warehouseName + "仓库产品压库进、销、存报表";
				}else if (balance_mode.equals("")){
					title1 = warehouseName + "仓库产品库进、销、存报表";
			    }
			}
			// 保存供应商列表集合
			Vector vec = null;
			/** 如果供应商名称参数为空 则从数据库中提取供应商 条件:以用户查询时间段为区间 */
			boolean needall = needAll.toLowerCase().equals("yes");// 是否是所有相关查询
			// 判断结算模式（1和10有区别）
			if (balance_mode.equals("0")) {
				vec = detailqueryProviderGroupWithOutBalance_mode(
						warehouseCode, start, end, providerName, needall);
			} else if(balance_mode.equals("")){
				vec = detailqueryProviderGroupWithOutBalance_mode(
						warehouseCode, start, end, providerName, needall);
			}else{
				vec = detailqueryProviderGroup(warehouseCode, start, end,
						providerName, needall, balance_mode);
			}
			if (vec == null) {
				vec = new Vector();
				isAvaliable = false;
			}
			int size = vec.size();
			/** 按供应商提取出入库明细 */
			int totalSize = 0;
			for (int i = 0; i < size; i++) {
				ProviderTemp pt = (ProviderTemp) vec.get(i);
				String name = pt.providerCode;
				Vector vec1 = new Vector();
				String all = null;

				masterStart = " select " + "aaa1.*,"
						+ "aaa2.CONCENTRICITY_CODE," + "aaa2.apep_code,"
						+ "aaa2.name,aaa2.spec," + "aaa2.model,"
						+ "aaa2.product_brand," + "aaa2.product_unit" ;
				if(title.equals("19")){
					masterStart += ",aaa3.product_type";
				}
				masterStart	+=" from ( ";
				if (needall) {
					if(title.equals("19"))
						masterEnd =" ) aaa1,t_product aaa2,t_product_type aaa3 where aaa1.pro_id = aaa2.id and aaa1.pro_id = aaa3.product_id and (abs(aaa1.init_count) + abs(aaa1.in_count) + abs(aaa1.out_count) + abs(aaa1.final_count)) > 0 and aaa3.status=1 ";
					else
						masterEnd = " ) aaa1,t_product aaa2 where aaa1.pro_id = aaa2.id and (abs(aaa1.init_count) + abs(aaa1.in_count) + abs(aaa1.out_count) + abs(aaa1.final_count)) > 0" ;
				} else {		
					if(title.equals("19"))
						masterEnd = " ) aaa1,t_product aaa2,t_product_type aaa3 where (abs(aaa1.in_count) + abs(aaa1.out_count)) > 0 and aaa1.pro_id = aaa2.id and aaa1.pro_id = aaa3.product_id and aaa3.status=1 ";
					else
						masterEnd = " ) aaa1,t_product aaa2 where (abs(aaa1.in_count) + abs(aaa1.out_count)) > 0 and aaa1.pro_id = aaa2.id ";
				}
				masterPart1Start = " select "
						+ " aa1.product_id pro_id, "
						+ " aa1.product_price, "// /////////
						+ " sum(aa1.init_count) init_count, "
						+ " sum(aa1.init_money) init_money, "
						+ " sum(aa1.in_count) in_count, "
						+ " sum(aa1.in_money) in_money, "
						+ " sum(aa1.out_count) out_count, "
						+ " sum(aa1.out_money) out_money, "
						+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
						+ " sum(aa1.init_money) + sum(aa1.in_money) - sum(aa1.out_money) final_money "
						+ " from ( ";
				masterPart1End = " ) aa1 group by aa1.product_id,aa1.product_price ";// //////////
				in = " select "
						+ " insub.product_id, "
						+ " insub.product_price, "// /////////
						+ " 0 init_count, " + " 0 init_money, "
						+ " sum(insub.product_count) in_count, ";
				if (GSBaseConstants.PLANPRICE.equals("true")) {
					in = in
							+ " sum(insub.product_count * insub.actual_price) in_money, ";
				} else {
					in = in + " sum(insub.product_money) in_money, ";
				}

				in = in
						+ " 0 out_count, "
						+ " 0 out_money "
						+ " from "
						+ " t_in_sub insub "
						+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
						// + " left outer join t_product product on
						// insub.product_id = product.id " //改变供应商条件查询关联
						+ " where " + " 1 = 1 "
						+ " and inhead.warehouse_code like '" + warehouseCode
						+ "%' " 
						+ " and inhead.in_time >= '" + start + "' "
						+ " and inhead.in_time <= '" + end + "' "
				+ " and insub.create_time >= '" + start + "' "
				+ " and insub.create_time <= '" + end + "' ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					in += " and insub.balance_mode = '" + balance_mode+"'";
				}
				if (position != null && position.trim().length() > 0) {
					in += " and insub.position_code = '" + position.trim()
							+ "' ";
				}
				in += " and insub.status = '1'"
						+ " and inhead.provider_code = '" + name
						+ "' " // 改变供应商条件查询关联
						+ " group by "
						+ " insub.product_id,insub.product_price ";// ////////////////
				out = " select "
						+ " outsub.product_id, "
						+ " outsub.product_price, "// /////////
						+ " 0 init_count, " + " 0 init_money, "
						+ " 0 in_count, " + " 0 in_money, "
						+ " sum(outsub.product_count) out_count, ";

				if (GSBaseConstants.PLANPRICE.equals("true")) {
					out = out
							+ " sum(outsub.product_count * outsub.actual_price) out_money ";
				} else {
					out = out + " sum(outsub.product_money) out_money ";
				}

				out = out
						+ " from "
						+ " t_out_sub outsub "
						+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
						+ " left outer join t_product product on outsub.product_id = product.id "
						+ " where " + " 1 = 1 "
						+ " and outhead.warehouse_code like '" + warehouseCode
						+ "%' " 
						+ " and outhead.out_time >= '" + start + "' "
						+ " and outhead.out_time <= '" + end + "' "
				+ " and outsub.create_time >= '" + start + "' "
				+ " and outsub.create_time <= '" + end + "' ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					out += " and outsub.balance_mode = '" + balance_mode+"'";
				}
				if (position != null && position.trim().length() > 0) {
					out += " and outsub.position_code = '" + position.trim()
							+ "' ";
				}
				out += " and outsub.status = '1'"
						// + " and product.provider_code = '" + name + "' "
						+ " and outsub.provider_code = '" + name
						+ "' " // 改变供应商条件查询关联
						+ " group by "
						+ " outsub.product_id,outsub.product_price ";// /////////
				if (isType2) {
					newMonthStorage =
						" select "+
						" sub_month.product_id, "+
						" sub_month.product_price, "+// /////////
						" sum(sub_month.son_init_count)+sum(sub_month.son_in_count) - sum(sub_month.son_out_count) init_count, "+
						" sum(sub_month.son_init_money)+sum(sub_month.son_in_money) - sum(sub_month.son_out_money) init_money, "+
						" 0 in_count, "+
						" 0 in_money, "+
						" 0 out_count, "+
						" 0 out_money  "+
						" from ( "+
						" select  "+
						" son_insub.product_id,  "+
						" son_insub.product_price, "+// /////////;
						" 0 son_init_count,  "+
						" 0 son_init_money,  "+
						" sum(son_insub.product_count) son_in_count,  ";

					if(GSBaseConstants.PLANPRICE.equals("true")){
						newMonthStorage = newMonthStorage +  " sum(son_insub.product_count * son_insub.actual_price) son_in_money,  ";
					}
					else{
						newMonthStorage = newMonthStorage +  " sum(son_insub.product_money) son_in_money,  ";
					}

					newMonthStorage = newMonthStorage +  " 0 son_out_count,  "+
					" 0 son_out_money  "+
					" from  "+
					" t_in_sub son_insub  "+
					" left outer join t_in_head son_inhead on son_insub.in_bill_id = son_inhead.id "+
					" where  "+
					" 1 = 1  "+
					" and son_inhead.warehouse_code like '" + warehouseCode + "%' " +
					" and son_inhead.in_time >= '"+startType2+"'  "+
					" and son_inhead.in_time <= '"+endType2+"'  "+
					" and son_insub.create_time >= '"+startType2+"'  "+
					" and son_insub.create_time <= '"+endType2+"'  "+
					" and son_insub.status = '1'"+
					" and son_inhead.provider_code = '"+name+"'  ";
					if (balance_mode.equals("1") || balance_mode.equals("2")) {
						newMonthStorage += " and son_insub.balance_mode = '"
								+ balance_mode + "'  ";
					}
					if (position != null && position.trim().length() > 0) {
						newMonthStorage += " and son_insub.position_code = '"
								+ position.trim() + "' ";
					}
					newMonthStorage +=	" group by  "+
					" son_insub.product_id,son_insub.product_price "+// ////////////
					" union all "+
					" select  "+
					" son_outsub.product_id,  "+
					" son_outsub.product_price, "+// /////////
					" 0 son_init_count,  "+
					" 0 son_init_money,  "+
					" 0 son_in_count,  "+
					" 0 son_in_money,  "+
					" sum(son_outsub.product_count) son_out_count,  ";

					if(GSBaseConstants.PLANPRICE.equals("true")){
						newMonthStorage = newMonthStorage + " sum(son_outsub.product_count * son_outsub.actual_price) son_out_money  ";
					}
					else{
						newMonthStorage = newMonthStorage + " sum(son_outsub.product_money) son_out_money  ";
					}

					newMonthStorage = newMonthStorage + " from  "+
					" t_out_sub son_outsub  "+
					" left outer join t_out_head son_outhead  "+
					" on son_outsub.out_bill_id = son_outhead.id  "+

					" where  "+
					" 1 = 1  "+
					" and son_outhead.warehouse_code like '" + warehouseCode + "%' " +
					" and son_outhead.out_time >= '"+startType2+"'  "+
					" and son_outhead.out_time <= '"+endType2+"'  "+
					" and son_outsub.create_time >= '"+startType2+"'  "+
					" and son_outsub.create_time <= '"+endType2+"'  "+
					" and son_outsub.status = '1'";
					if (balance_mode.equals("1") || balance_mode.equals("2")) {
						newMonthStorage += " and son_outsub.balance_mode = '"
								+ balance_mode + "'  ";
					}
					if (position != null && position.trim().length() > 0) {
						newMonthStorage += " and son_outsub.position_code = '"
								+ position.trim() + "' ";
					}
					newMonthStorage +=" and son_outsub.provider_code = '"+name+"'  "+// 改变供应商条件查询关联
					" group by  "+
					" son_outsub.product_id,son_outsub.product_price " +
					" union all ";
					newMonthStorage+= " select "
						+ " ms.product_id, "
						+ " ms.product_price product_price, "
						+ // /////////
						"sum(ms.product_count) init_count, "
						+ " sum(ms.product_money) init_money, "
						+ " 0 in_count, " + " 0 in_money, "
						+ " 0 out_count, "
						+ " 0 out_money  "
						+ " from  "
						+ " t_month_storage ms "
						+
						// //改变供应商条件查询关联
						" where  " + " 1 = 1  "
						+ " and ms.warehouse_code like '"
						+ warehouseCode + "%' "
						+ " and ms.month = '" + dataMonth + "'  ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					newMonthStorage += " and ms.balance_mode = '"
							+ balance_mode + "'  ";
				}
				if (position != null && position.trim().length() > 0) {
					newMonthStorage += " and ms.position_code = '"
							+ position.trim() + "' ";
				}
				newMonthStorage += " and ms.status = '1'"
						+
						// "+//改变供应商条件查询关联
						" and ms.provider_code = '"
						+ name
						+ "'  "
						+ // 改变供应商条件查询关联
						" group by  "
						+ " ms.product_id,ms.product_price ";// ////////////
                ////
				newMonthStorage += 	" ) sub_month  "+
					" group by sub_month.product_id,sub_month.product_price ";// //////////
				} else {
					newMonthStorage = " select "
						+ " sub_month.product_id, "
						+ " sub_month.product_price product_price, "
						+ // /////////
						" sum(sub_month.product_count) init_count, "
						+ " sum(sub_month.product_money) init_money, "
						+ " 0 in_count, " + " 0 in_money, "
						+ " 0 out_count, "
						+ " 0 out_money  "
						+ " from  "
						+ " t_month_storage sub_month "
						+
						// //改变供应商条件查询关联
						" where  " + " 1 = 1  "
						+ " and sub_month.warehouse_code like '"
						+ warehouseCode + "%' "
						+ " and sub_month.month = '" + dataMonth + "'  ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					newMonthStorage += " and sub_month.balance_mode = '"
							+ balance_mode + "'  ";
				}
				if (position != null && position.trim().length() > 0) {
					newMonthStorage += " and sub_month.position_code = '"
							+ position.trim() + "' ";
				}
				newMonthStorage += " and sub_month.status = '1'"
						+
						// "+//改变供应商条件查询关联
						" and sub_month.provider_code = '"
						+ name
						+ "'  "
						+ // 改变供应商条件查询关联
						" group by  "
						+ " sub_month.product_id,sub_month.product_price";//
				}

				DBConnection con = null;
				DBResult dbrs = null;
				ResultSet rs = null;
				all = masterStart + masterPart1Start + newMonthStorage
						+ " union all " + in + " union all " + out
						+ masterPart1End + masterEnd;
				try {
					if(title.equals("19")){
						con = DBConnection.open(false);
						dbrs = DBEngine.doSelect(con, all);
						rs = dbrs.getRs();
						vec1.add(pt);
						while (rs.next()) {
							totalSize++;
							String[] values = new String[17];
							values[0] = rs.getString("concentricity_code");
							values[1] = rs.getString("init_count");
							values[2] = rs.getString("init_money");
							values[3] = rs.getString("in_count");
							values[4] = rs.getString("in_money");
							values[5] = rs.getString("out_count");
							values[6] = rs.getString("out_money");
							values[7] = rs.getString("final_count");
							values[8] = rs.getString("final_money");
							values[9] = rs.getString("apep_code");
							values[10] = rs.getString("name");
							values[11] = rs.getString("spec");
							values[12] = rs.getString("model");
							values[13] = rs.getString("product_brand");
							values[14] = rs.getString("product_unit");
							values[15] = rs.getString("product_price");
							values[16] = rs.getString("product_type");
							vec1.add(values);
						}
					}else{
							con = DBConnection.open(false);
							dbrs = DBEngine.doSelect(con, all);
							rs = dbrs.getRs();
							vec1.add(pt);
							while (rs.next()) {
								totalSize++;
								String[] values = new String[16];
								values[0] = rs.getString("concentricity_code");
								values[1] = rs.getString("init_count");
								values[2] = rs.getString("init_money");
								values[3] = rs.getString("in_count");
								values[4] = rs.getString("in_money");
								values[5] = rs.getString("out_count");
								values[6] = rs.getString("out_money");
								values[7] = rs.getString("final_count");
								values[8] = rs.getString("final_money");
								values[9] = rs.getString("apep_code");
								values[10] = rs.getString("name");
								values[11] = rs.getString("spec");
								values[12] = rs.getString("model");
								values[13] = rs.getString("product_brand");
								values[14] = rs.getString("product_unit");
								values[15] = rs.getString("product_price");
								vec1.add(values);
							}
					}
					vec2.add(vec1);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						if (rs != null) {
							rs.close();
						}
					} catch (SQLException e) {
						e.printStackTrace();
					}
					try {
						if (dbrs != null) {
							dbrs.clear();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
					try {
						if (con != null) {
							con.close();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			if (!isAvaliable) {
				isAvaliable = false;
			} else if (totalSize > 13000) {
				isAvaliable = false;
				isLager = true;
			} else {
				if("19".equals(title)){
					writeExcel_ProviderproductType(newMonthStorage, title, fileName, vec2, title1, start, end, warehouseCode, request, response);
				}else if("18".equals(title)){
					writeExcel_ReportYKProductAll(month, title, fileName, vec2, title1, start, end, warehouseCode, request, response);
				}else{
					writeExcel_ReportYKProduct(month, title, fileName, vec2,
						title1, start, end, warehouseCode, request, response);
				}
			}
		}else if("23".equals(title)){
			String masterStart = "";
			title1 = warehouseName+"仓库外修领用汇总报表";
			
			// 判断结算模式（1和10有区别）
			/** 按供应商提取出入库明细 */
				List list1 = new ArrayList();
			    Map map = new HashMap();
				String all = null;

				masterStart = " select distinct outsub.provider_code from "
						+ "  t_out_sub outsub left outer join t_out_head outhead on outsub.out_bill_code=outhead.out_bill_code "
						+ " left join t_product pro on pro.id=outsub.product_id where outhead.warehouse_code like '"+warehouseCode+"%' "
						+ " and outhead.out_time >= '" + start + "' "
						+ " and outhead.out_time <= '" + end + "' "
						+ " and outhead.out_type='2003' and outsub.status=1 ";


				DBConnection con = null;
				DBResult dbrs = null;
				ResultSet rs = null;
				all = masterStart ;
				try {
							con = DBConnection.open(false);
							dbrs = DBEngine.doSelect(con, all);
							rs = dbrs.getRs();
							while (rs.next()) {
								String[] values = new String[1];
								values[0] = rs.getString("provider_code");
								list1.add(values[0]);
							}	
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						if (rs != null) {
							rs.close();
						}
					} catch (SQLException e) {
						e.printStackTrace();
					}
					try {
						if (dbrs != null) {
							dbrs.clear();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
					try {
						if (con != null) {
							con.close();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			if (!isAvaliable) {
				isAvaliable = false;
			} else {
				writeExcel_ReportRepairDetail(warehouseCode,title,title1,fileName,map,list1, start, end, request, response);
			}
		}
		 else if("22".equals(title)){
				String masterStart = "";
				String[] months=start.split("-");
				String[] months2=end.split("-");
				String startMonth=months[0]+"-"+months[1];
				String endMonth=months2[0]+"-"+months2[1];
				if(startMonth.equals(endMonth)){
					title1 = months[0]+"年"+months[1] + "月外修领用汇总报表";
				}else{
					title1 = "外修领用汇总报表";
				}
				
			
				
				// 判断结算模式（1和10有区别）
				/** 按供应商提取出入库明细 */
					List list1 = new ArrayList();
				    Map map = new HashMap();
					String all = null;

					masterStart = " select " + "outhead.warehouse_name,outsub.balance_mode,sum(outsub.product_money) money from "
							+ " t_out_sub outsub left outer join t_out_head outhead on outsub.out_bill_code=outhead.out_bill_code where outhead.out_type='2003' "
							+ " and outhead.out_time >= '" + start + "' "
							+ " and outhead.out_time <= '" + end + "' "
							+ "group by outhead.warehouse_name,outsub.balance_mode" ;


					DBConnection con = null;
					DBResult dbrs = null;
					ResultSet rs = null;
					all = masterStart ;
					try {
								con = DBConnection.open(false);
								dbrs = DBEngine.doSelect(con, all);
								rs = dbrs.getRs();
								while (rs.next()) {
									String[] values = new String[3];
									values[0] = rs.getString("warehouse_name");
									values[1] = rs.getString("balance_mode");
									values[2] = rs.getString("money");
									if(list1.size()==0){
										list1.add(values[0]);
									}
									if(!list1.contains(values[0])){
										list1.add(values[0]);
									}
									map.put(values[0]+'-'+values[1],values[2]);
								}	
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						try {
							if (rs != null) {
								rs.close();
							}
						} catch (SQLException e) {
							e.printStackTrace();
						}
						try {
							if (dbrs != null) {
								dbrs.clear();
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
						try {
							if (con != null) {
								con.close();
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				if (!isAvaliable) {
					isAvaliable = false;
				} else {
					writeExcel_ReportRepairSum(title,title1,fileName,map,list1, start, end, request, response);
				}
			
		}else if("21".equals(title)){
			String masterStart = "";
			String masterEnd = "";
			String masterPart1Start = "";
			String masterPart1End = "";
			String in = "";
			String out = "";
			String newMonthStorage = "";
			Vector vec2 = new Vector();
			String balance_mode = request.getParameter("balanceMode");
			String position = request.getParameter("positionCode");

			title1 = warehouseName + "仓库仓库外修产品进、销、存报表";
			
			// 保存供应商列表集合
			Vector vec = null;
			/** 如果供应商名称参数为空 则从数据库中提取供应商 条件:以用户查询时间段为区间 */
			boolean needall = needAll.toLowerCase().equals("yes");// 是否是所有相关查询
			// 判断结算模式（1和10有区别）
			if (balance_mode.equals("0")) {
				vec = detailqueryProviderRepairWithOutBalance_mode(
						warehouseCode, start, end, providerName, needall);
			} else if(balance_mode.equals("")){
				vec = detailqueryProviderRepairWithOutBalance_mode(
						warehouseCode, start, end, providerName, needall);
			}else{
				vec = detailqueryProviderRepair(warehouseCode, start, end,
						providerName, needall, balance_mode);
			}
			if (vec == null) {
				vec = new Vector();
				isAvaliable = false;
			}
			int size = vec.size();
			/** 按供应商提取出入库明细 */
			int totalSize = 0;
			for (int i = 0; i < size; i++) {
				ProviderTemp pt = (ProviderTemp) vec.get(i);
				String name = pt.providerCode;
				Vector vec1 = new Vector();
				String all = null;

				masterStart = " select " + "aaa1.*,"
						+ "aaa2.CONCENTRICITY_CODE," + "aaa2.apep_code,"
						+ "aaa2.name,aaa2.spec," + "aaa2.model,"
						+ "aaa2.product_brand," + "aaa2.product_unit" ;
				if(title.equals("19")){
					masterStart += ",aaa3.product_type";
				}
				masterStart	+=" from ( ";
				if (needall) {
						masterEnd = " ) aaa1,t_product aaa2,t_product_type aaa3 where aaa1.pro_id=aaa3.product_id and aaa1.pro_id = aaa2.id and aaa3.product_type=12 and (abs(aaa1.init_count) + abs(aaa1.in_count) + abs(aaa1.out_count) + abs(aaa1.final_count)) > 0" ;
				} else {		
						masterEnd = " ) aaa1,t_product aaa2,t_product_type aaa3 where aaa1.pro_id=aaa3.product_id and (abs(aaa1.in_count) + abs(aaa1.out_count)) > 0 and aaa3.product_type=12 and aaa1.pro_id = aaa2.id ";
				}
				masterPart1Start = " select "
						+ " aa1.product_id pro_id, "
						+ " aa1.product_price, "// /////////
						+ " sum(aa1.init_count) init_count, "
						+ " sum(aa1.init_money) init_money, "
						+ " sum(aa1.in_count) in_count, "
						+ " sum(aa1.in_money) in_money, "
						+ " sum(aa1.out_count) out_count, "
						+ " sum(aa1.out_money) out_money, "
						+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
						+ " sum(aa1.init_money) + sum(aa1.in_money) - sum(aa1.out_money) final_money "
						+ " from ( ";
				masterPart1End = " ) aa1 group by aa1.product_id,aa1.product_price ";// //////////
				in = " select "
						+ " insub.product_id, "
						+ " insub.product_price, "// /////////
						+ " 0 init_count, " + " 0 init_money, "
						+ " sum(insub.product_count) in_count, ";
				if (GSBaseConstants.PLANPRICE.equals("true")) {
					in = in
							+ " sum(insub.product_count * insub.actual_price) in_money, ";
				} else {
					in = in + " sum(insub.product_money) in_money, ";
				}

				in = in
						+ " 0 out_count, "
						+ " 0 out_money "
						+ " from "
						+ " t_in_sub insub "
						+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
						// + " left outer join t_product product on
						// insub.product_id = product.id " //改变供应商条件查询关联
						+ " where " + " 1 = 1 "
						+ " and inhead.warehouse_code like '" + warehouseCode
						+ "%' " 
						+ " and inhead.in_time >= '" + start + "' "
						+ " and inhead.in_time <= '" + end + "' "
				+ " and insub.create_time >= '" + start + "' "
				+ " and insub.create_time <= '" + end + "' ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					in += " and insub.balance_mode = '" + balance_mode+"'";
				}
				if (position != null && position.trim().length() > 0) {
					in += " and insub.position_code = '" + position.trim()
							+ "' ";
				}
				in += " and insub.status = '1'"
						+ " and inhead.provider_code = '" + name
						+ "' " // 改变供应商条件查询关联
						+ " group by "
						+ " insub.product_id,insub.product_price ";// ////////////////
				out = " select "
						+ " outsub.product_id, "
						+ " outsub.product_price, "// /////////
						+ " 0 init_count, " + " 0 init_money, "
						+ " 0 in_count, " + " 0 in_money, "
						+ " sum(outsub.product_count) out_count, ";

				if (GSBaseConstants.PLANPRICE.equals("true")) {
					out = out
							+ " sum(outsub.product_count * outsub.actual_price) out_money ";
				} else {
					out = out + " sum(outsub.product_money) out_money ";
				}

				out = out
						+ " from "
						+ " t_out_sub outsub "
						+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
						+ " left outer join t_product product on outsub.product_id = product.id "
						+ " where " + " 1 = 1 "
						+ " and outhead.warehouse_code like '" + warehouseCode
						+ "%' " 
						+ " and outhead.out_time >= '" + start + "' "
						+ " and outhead.out_time <= '" + end + "' "
				+ " and outsub.create_time >= '" + start + "' "
				+ " and outsub.create_time <= '" + end + "' ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					out += " and outsub.balance_mode = '" + balance_mode+"'";
				}
				if (position != null && position.trim().length() > 0) {
					out += " and outsub.position_code = '" + position.trim()
							+ "' ";
				}
				out += " and outsub.status = '1'"
						// + " and product.provider_code = '" + name + "' "
						+ " and outsub.provider_code = '" + name
						+ "' " // 改变供应商条件查询关联
						+ " group by "
						+ " outsub.product_id,outsub.product_price ";// /////////
				if (isType2) {
					newMonthStorage =
						" select "+
						" sub_month.product_id, "+
						" sub_month.product_price, "+// /////////
						" sum(sub_month.son_init_count)+sum(sub_month.son_in_count) - sum(sub_month.son_out_count) init_count, "+
						" sum(sub_month.son_init_money)+sum(sub_month.son_in_money) - sum(sub_month.son_out_money) init_money, "+
						" 0 in_count, "+
						" 0 in_money, "+
						" 0 out_count, "+
						" 0 out_money  "+
						" from ( "+
						" select  "+
						" son_insub.product_id,  "+
						" son_insub.product_price, "+// /////////;
						" 0 son_init_count,  "+
						" 0 son_init_money,  "+
						" sum(son_insub.product_count) son_in_count,  ";

					if(GSBaseConstants.PLANPRICE.equals("true")){
						newMonthStorage = newMonthStorage +  " sum(son_insub.product_count * son_insub.actual_price) son_in_money,  ";
					}
					else{
						newMonthStorage = newMonthStorage +  " sum(son_insub.product_money) son_in_money,  ";
					}

					newMonthStorage = newMonthStorage +  " 0 son_out_count,  "+
					" 0 son_out_money  "+
					" from  "+
					" t_in_sub son_insub  "+
					" left outer join t_in_head son_inhead on son_insub.in_bill_id = son_inhead.id "+
					" where  "+
					" 1 = 1  "+
					" and son_inhead.warehouse_code like '" + warehouseCode + "%' " +
					" and son_inhead.in_time >= '"+startType2+"'  "+
					" and son_inhead.in_time <= '"+endType2+"'  "+
					" and son_insub.create_time >= '"+startType2+"'  "+
					" and son_insub.create_time <= '"+endType2+"'  "+
					" and son_insub.status = '1'"+
					" and son_inhead.provider_code = '"+name+"'  ";
					if (balance_mode.equals("1") || balance_mode.equals("2")) {
						newMonthStorage += " and son_insub.balance_mode = '"
								+ balance_mode + "'  ";
					}
					if (position != null && position.trim().length() > 0) {
						newMonthStorage += " and son_insub.position_code = '"
								+ position.trim() + "' ";
					}
					newMonthStorage +=	" group by  "+
					" son_insub.product_id,son_insub.product_price "+// ////////////
					" union all "+
					" select  "+
					" son_outsub.product_id,  "+
					" son_outsub.product_price, "+// /////////
					" 0 son_init_count,  "+
					" 0 son_init_money,  "+
					" 0 son_in_count,  "+
					" 0 son_in_money,  "+
					" sum(son_outsub.product_count) son_out_count,  ";

					if(GSBaseConstants.PLANPRICE.equals("true")){
						newMonthStorage = newMonthStorage + " sum(son_outsub.product_count * son_outsub.actual_price) son_out_money  ";
					}
					else{
						newMonthStorage = newMonthStorage + " sum(son_outsub.product_money) son_out_money  ";
					}

					newMonthStorage = newMonthStorage + " from  "+
					" t_out_sub son_outsub  "+
					" left outer join t_out_head son_outhead  "+
					" on son_outsub.out_bill_id = son_outhead.id  "+

					" where  "+
					" 1 = 1  "+
					" and son_outhead.warehouse_code like '" + warehouseCode + "%' " +
					" and son_outhead.out_time >= '"+startType2+"'  "+
					" and son_outhead.out_time <= '"+endType2+"'  "+
					" and son_outsub.create_time >= '"+startType2+"'  "+
					" and son_outsub.create_time <= '"+endType2+"'  "+
					" and son_outsub.status = '1'";
					if (balance_mode.equals("1") || balance_mode.equals("2")) {
						newMonthStorage += " and son_outsub.balance_mode = '"
								+ balance_mode + "'  ";
					}
					if (position != null && position.trim().length() > 0) {
						newMonthStorage += " and son_outsub.position_code = '"
								+ position.trim() + "' ";
					}
					newMonthStorage +=" and son_outsub.provider_code = '"+name+"'  "+// 改变供应商条件查询关联
					" group by  "+
					" son_outsub.product_id,son_outsub.product_price " +
					" union all ";
					newMonthStorage+= " select "
						+ " ms.product_id, "
						+ " ms.product_price product_price, "
						+ // /////////
						"sum(ms.product_count) init_count, "
						+ " sum(ms.product_money) init_money, "
						+ " 0 in_count, " + " 0 in_money, "
						+ " 0 out_count, "
						+ " 0 out_money  "
						+ " from  "
						+ " t_month_storage ms "
						+
						// //改变供应商条件查询关联
						" where  " + " 1 = 1  "
						+ " and ms.warehouse_code like '"
						+ warehouseCode + "%' "
						+ " and ms.month = '" + dataMonth + "'  ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					newMonthStorage += " and ms.balance_mode = '"
							+ balance_mode + "'  ";
				}
				if (position != null && position.trim().length() > 0) {
					newMonthStorage += " and ms.position_code = '"
							+ position.trim() + "' ";
				}
				newMonthStorage += " and ms.status = '1'"
						+
						// "+//改变供应商条件查询关联
						" and ms.provider_code = '"
						+ name
						+ "'  "
						+ // 改变供应商条件查询关联
						" group by  "
						+ " ms.product_id,ms.product_price ";// ////////////
                ////
				newMonthStorage += 	" ) sub_month  "+
					" group by sub_month.product_id,sub_month.product_price ";// //////////
				} else {
					newMonthStorage = " select "
						+ " sub_month.product_id, "
						+ " sub_month.product_price product_price, "
						+ // /////////
						" sum(sub_month.product_count) init_count, "
						+ " sum(sub_month.product_money) init_money, "
						+ " 0 in_count, " + " 0 in_money, "
						+ " 0 out_count, "
						+ " 0 out_money  "
						+ " from  "
						+ " t_month_storage sub_month "
						+
						// //改变供应商条件查询关联
						" where  " + " 1 = 1  "
						+ " and sub_month.warehouse_code like '"
						+ warehouseCode + "%' "
						+ " and sub_month.month = '" + dataMonth + "'  ";
				if (balance_mode.equals("1") || balance_mode.equals("2")) {
					newMonthStorage += " and sub_month.balance_mode = '"
							+ balance_mode + "'  ";
				}
				if (position != null && position.trim().length() > 0) {
					newMonthStorage += " and sub_month.position_code = '"
							+ position.trim() + "' ";
				}
				newMonthStorage += " and sub_month.status = '1'"
						+
						// "+//改变供应商条件查询关联
						" and sub_month.provider_code = '"
						+ name
						+ "'  "
						+ // 改变供应商条件查询关联
						" group by  "
						+ " sub_month.product_id,sub_month.product_price";//
				}

				DBConnection con = null;
				DBResult dbrs = null;
				ResultSet rs = null;
				all = masterStart + masterPart1Start + newMonthStorage
						+ " union all " + in + " union all " + out
						+ masterPart1End + masterEnd;
				try {
					if(title.equals("19")){
						con = DBConnection.open(false);
						dbrs = DBEngine.doSelect(con, all);
						rs = dbrs.getRs();
						vec1.add(pt);
						while (rs.next()) {
							totalSize++;
							String[] values = new String[17];
							values[0] = rs.getString("concentricity_code");
							values[1] = rs.getString("init_count");
							values[2] = rs.getString("init_money");
							values[3] = rs.getString("in_count");
							values[4] = rs.getString("in_money");
							values[5] = rs.getString("out_count");
							values[6] = rs.getString("out_money");
							values[7] = rs.getString("final_count");
							values[8] = rs.getString("final_money");
							values[9] = rs.getString("apep_code");
							values[10] = rs.getString("name");
							values[11] = rs.getString("spec");
							values[12] = rs.getString("model");
							values[13] = rs.getString("product_brand");
							values[14] = rs.getString("product_unit");
							values[15] = rs.getString("product_price");
							values[16] = rs.getString("product_type");
							vec1.add(values);
						}
					}else{
							con = DBConnection.open(false);
							dbrs = DBEngine.doSelect(con, all);
							rs = dbrs.getRs();
							vec1.add(pt);
							while (rs.next()) {
								totalSize++;
								String[] values = new String[16];
								values[0] = rs.getString("concentricity_code");
								values[1] = rs.getString("init_count");
								values[2] = rs.getString("init_money");
								values[3] = rs.getString("in_count");
								values[4] = rs.getString("in_money");
								values[5] = rs.getString("out_count");
								values[6] = rs.getString("out_money");
								values[7] = rs.getString("final_count");
								values[8] = rs.getString("final_money");
								values[9] = rs.getString("apep_code");
								values[10] = rs.getString("name");
								values[11] = rs.getString("spec");
								values[12] = rs.getString("model");
								values[13] = rs.getString("product_brand");
								values[14] = rs.getString("product_unit");
								values[15] = rs.getString("product_price");
								vec1.add(values);
							}
					}
					vec2.add(vec1);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						if (rs != null) {
							rs.close();
						}
					} catch (SQLException e) {
						e.printStackTrace();
					}
					try {
						if (dbrs != null) {
							dbrs.clear();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
					try {
						if (con != null) {
							con.close();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			if (!isAvaliable) {
				isAvaliable = false;
			} else if (totalSize > 13000) {
				isAvaliable = false;
				isLager = true;
			} else {
				if("19".equals(title)){
					writeExcel_ProviderproductType(newMonthStorage, title, fileName, vec2, title1, start, end, warehouseCode, request, response);
				}else if("18".equals(title)){
					writeExcel_ReportYKProductAll(month, title, fileName, vec2, title1, start, end, warehouseCode, request, response);
				}else{
					writeExcel_ReportYKProduct(month, title, fileName, vec2,
						title1, start, end, warehouseCode, request, response);
				}
			}
		}
		/** 领用报表 */
		else if ("2".equals(title)) {
			String customerName = "";
			try {
				DBConnection con = null;
				con = DBConnection.open(false);
				customerName = Customer.fetchByCode(con, customerCode)
						.getName();
				con.close();

				String date = ""; // 显示日期
				if ("1".equals(querytype)) {
					title1 = warehouseName + "仓库" + customerName + "公司领用月报";
					date = "统计月:" + start.substring(0, 7);

				} else {
					title1 = warehouseName + "仓库" + customerName + "公司领用日报";
					date = "统计日:" + start.substring(0, 10);
				}
				ObjectList list = detailquery2Group(warehouseCode,
						customerCode, start, end);
				ObjectList cList = detailquery2(warehouseCode, customerCode,
						start, end);
				if (list.size() == 0) {
					isAvaliable = false;
				} else if (list.size() > 13000) {
					isAvaliable = false;
					isLager = true;
				} else {
					writeExcel_ReportCustomer(title, fileName, list, cList,
							title1, date, request, response);
				}
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}
		} else if ("3".equals(title) || "10".equals(title)) {
			if (GSBaseConstants.PLANPRICE.equals("true")) {
				title1 = warehouseName + "仓库产品进、销、存资金汇总月报";
			} else {
				title1 = warehouseName + "仓库压库产品进、销、存资金汇总月报";
			}
			// 期初分类查询入库查询不包括"申沃"产品分类部分
			String monthSotragePartIn1 = " select "
				+ " substr(category_code, 1, 1) || '0000' category_code, "
				+ " sum(product_count) init_count, "
				+ " sum(product_money) init_money "
				+ " from "
				+ " t_in_sub insub "
				+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
				+ " left outer join t_product product on insub.product_id = product.id "
				+ " where " + " 1 = 1 " + " and inhead.warehouse_code like '" + warehouseCode + "%' " 
				+ " and inhead.in_time >= '"+ startType2 +"' "
				+ " and inhead.in_time <= '"+ endType2 +"' "
				+ " and insub.create_time >= '"+ startType2 +"' "
				+ " and insub.create_time <= '"+ endType2 +"' "
				+ " and product.category_code <> '90001' " + " and insub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and insub.status = '1'" + " group by " + " substr(category_code, 1, 1) ";

			// 期初分类查询入库查询只包括"申沃"产品分类部分
			String monthStoragePartIn2 = " select "
				+ " category_code, "
				+ " sum(product_count) init_count, "
				+ " sum(product_money) init_money "
				+ " from "
				+ " t_in_sub insub "
				+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
				+ " left outer join t_product product on insub.product_id = product.id "
				// + " left outer join t_warehouse_product wp on
				// init.product_id = wp.product_id and wp.warehouse_code =
				// init.warehouse_code and init.position_code =
				// wp.default_location_code "
				+ " where " + " 1 = 1 " + " and inhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and inhead.in_time >= '"+ startType2 +"' "
				+ " and inhead.in_time <= '"+ endType2 +"' "
				+ " and insub.create_time >= '"+ startType2 +"' "
				+ " and insub.create_time <= '"+ endType2 +"' "
				+ " and product.category_code = '90001' " + " and insub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and insub.status = '1'" + " group by " + " category_code ";

			// 期初分类查询出库查询不包括"申沃"产品分类部分
			String monthSotragePartOut1 = " select "
				+ " substr(category_code, 1, 1) || '0000' category_code, "
				+ " sum(product_count) * -1 init_count, "
				+ " sum(product_money) * -1 init_money "
				+ " from "
				+ " t_out_sub outsub "
				+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
				+ " left outer join t_product product on outsub.product_id = product.id "
				// + " left outer join t_warehouse_product wp on
				// init.product_id = wp.product_id and wp.warehouse_code =
				// init.warehouse_code and init.position_code =
				// wp.default_location_code "
				+ " where " + " 1 = 1 " + " and outhead.warehouse_code like '" + warehouseCode + "%' " 
				+ " and outhead.out_time >= '"+ startType2 +"' "
				+ " and outhead.out_time <= '"+ endType2 +"' "
				+ " and outsub.create_time >= '"+ startType2 +"' "
				+ " and outsub.create_time <= '"+ endType2 +"' "
				+ " and product.category_code <> '90001' " + " and outsub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and outsub.status = '1'" + " group by " + " substr(category_code, 1, 1) ";

			// 期初分类查询出库查询只包括"申沃"产品分类部分
			String monthStoragePartOut2 = " select "
				+ " category_code, "
				+ " sum(product_count) * -1 init_count, "
				+ " sum(product_money) * -1 init_money "
				+ " from "
				+ " t_out_sub outsub "
				+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
				+ " left outer join t_product product on outsub.product_id = product.id "
				// + " left outer join t_warehouse_product wp on
				// init.product_id = wp.product_id and wp.warehouse_code =
				// init.warehouse_code and init.position_code =
				// wp.default_location_code "
				+ " where " + " 1 = 1 " + " and outhead.warehouse_code like '" + warehouseCode + "%' " 
				+ " and outhead.out_time >= '"+ startType2 +"' "
				+ " and outhead.out_time <= '"+ endType2 +"' "
				+ " and outsub.create_time >= '"+ startType2 +"' "
				+ " and outsub.create_time <= '"+ endType2 +"' "
				+ " and product.category_code = '90001' " + " and outsub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and outsub.status = '1'" + " group by " + " category_code ";


			String monthSotragePart1 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(product_count) init_count, "
					+ " sum(product_money) init_money "
					+ " from "
					+ " t_month_storage ms "
					+ " left outer join t_product product on ms.product_id = product.id "
					// + " left outer join t_warehouse_product wp on
					// init.product_id = wp.product_id and wp.warehouse_code =
					// init.warehouse_code and init.position_code =
					// wp.default_location_code "
					+ " where " + " 1 = 1 " + " and ms.warehouse_code like '"
					+ warehouseCode + "%' " + " and ms.month = '" + dataMonth
					+ "' " + " and product.category_code <> '90001' "
					+ " and ms.balance_mode = '"
					+ ConstDefine.getBalanceModeByFlag()
					+ "' and ms.status = '1'" + " group by "
					+ " substr(category_code, 1, 1) ";

			// 期初分类查询入库查询只包括"申沃"产品分类部分
			String monthStoragePart2 = " select "
					+ " category_code, "
					+ " sum(product_count) init_count, "
					+ " sum(product_money) init_money "
					+ " from "
					+ " t_month_storage ms  "
					+ " left outer join t_product product on ms.product_id = product.id "
					// + " left outer join t_warehouse_product wp on
					// init.product_id = wp.product_id and wp.warehouse_code =
					// init.warehouse_code and init.position_code =
					// wp.default_location_code "
					+ " where " + " 1 = 1 " + " and ms.warehouse_code like '"
					+ warehouseCode + "%' " + " and ms.month = '" + dataMonth
					+ "' " + " and product.category_code = '90001' "
					+ " and ms.balance_mode = '"
					+ ConstDefine.getBalanceModeByFlag()
					+ "' and ms.status = '1'" + " group by "
					+ " category_code ";

			// 入库查询子查询不包括"90001"部分
			String inPart1 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(insub.product_count) in_count, "
					+ " sum(insub.product_money) in_money "
					+ " from "
					+ " t_in_sub insub "
					+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
					+ " left outer join t_product product on insub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and inhead.warehouse_code like '" + warehouseCode
					+ "%' "
					+ " and inhead.in_time >= '" + start + "' "
					+ " and inhead.in_time <= '" + end + "' "
					+ " and insub.create_time >= '" + start + "' "
					+ " and insub.create_time <= '" + end + "' "
					+ " and product.category_code <> '90001' "
					+ " and insub.balance_mode = '"
					+ ConstDefine.getBalanceModeByFlag()
					+ "' and insub.status = '1'" + " group by "
					+ " substr(category_code, 1, 1) ";

			// 入库查询子查询只包括"90001"部分
			String inPart2 = " select "
					+ " category_code, "
					+ " sum(insub.product_count) in_count, "
					+ " sum(insub.product_money) in_money "
					+ " from "
					+ " t_in_sub insub "
					+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
					+ " left outer join t_product product on insub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and inhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and inhead.in_time >= '" + start + "' "
					+ " and inhead.in_time <= '" + end + "' "
					+ " and insub.create_time >= '" + start + "' "
					+ " and insub.create_time <= '" + end + "' "
					+ " and product.category_code = '90001' "
					+ " and insub.balance_mode = '"
					+ ConstDefine.getBalanceModeByFlag()
					+ "' and insub.status = '1'" + " group by "
					+ " category_code ";

			// 出库查询子查询不包括90001部分
			String outPart1 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(outsub.product_count) out_count, "
					+ " sum(outsub.product_money) out_money "
					+ " from "
					+ " t_out_sub outsub "
					+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
					+ " left outer join t_product product on outsub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and outhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and outhead.out_time >= '" + start + "' "
					+ " and outhead.out_time <= '" + end + "' "
					+ " and outsub.create_time >= '" + start + "' "
					+ " and outsub.create_time <= '" + end + "' "
					+ " and product.category_code <> '90001' "
					+ " and outsub.balance_mode = '"
					+ ConstDefine.getBalanceModeByFlag()
					+ "' and outsub.status = '1'"
					+ " group by substr(category_code, 1, 1) ";

			// 出库查询子查询只包括90001部分
			String outPart2 = " select "
					+ " category_code, "
					+ " sum(outsub.product_count) out_count, "
					+ " sum(outsub.product_money) out_money "
					+ " from "
					+ " t_out_sub outsub "
					+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
					+ " left outer join t_product product on outsub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and outhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and outhead.out_time >= '" + start + "' "
					+ " and outhead.out_time <= '" + end + "' "
					+ " and outsub.create_time >= '" + start + "' "
					+ " and outsub.create_time <= '" + end + "' "
					+ " and product.category_code = '90001' "
					+ " and outsub.balance_mode = '"
					+ ConstDefine.getBalanceModeByFlag()
					+ "' and outsub.status = '1'" + " group by category_code ";

			// 合计期初数据
			String sql_a3 = "";
			if (!isType2) {
				sql_a3 = "select " + "a3.category_code, "
						+ "sum(a3.init_count) init_count , "
						+ "sum(a3.init_money) init_money, " + "0 in_count, "
						+ "0 in_money, " + "0 out_count, " + "0 out_money "
						+ "from( " + monthSotragePart1 + " union all "
						+ monthStoragePart2
						+ " ) a3 group by a3.category_code ";
			} else {
				sql_a3 = "select " +
				"a3.category_code, " +
				"sum(a3.init_count) init_count , " +
				"sum(a3.init_money) init_money, " +
				"0 in_count, " +
				"0 in_money, " +
				"0 out_count, " +
				"0 out_money " +
				"from( " +
				monthSotragePartIn1 + " union all " +
				monthStoragePartIn2 + " union all " +
				monthSotragePartOut1 + " union all " +
				monthStoragePartOut2 + " union all " +
				monthSotragePart1 + " union all "+
				 monthStoragePart2+
				" ) a3 group by a3.category_code ";
			}
			String sql_a1 = "select a1.category_code, " + "0 init_count, "
					+ "0 init_money, " + "a1.in_count, " + "a1.in_money, "
					+ "0 out_count, " + "0 out_money " + "from( " + inPart1
					+ " union all" + inPart2 + ") a1 ";

			String sql_a2 = "select a2.category_code, " + "0 init_count, "
					+ "0 init_money, " + "0 in_count, " + "0 in_money, "
					+ "a2.out_count, " + "a2.out_money " + "from( " + outPart1
					+ " union all " + outPart2 + " ) a2 ";

			String all = "select "
					+ " aa1.category_code, "
					+ " sum(aa1.init_count) init_count, "
					+ " sum(aa1.init_money) init_money, "
					+ " sum(aa1.in_count) in_count, "
					+ " sum(aa1.in_money) in_money, "
					+ " sum(aa1.out_count) out_count, "
					+ " sum(aa1.out_money) out_money, "
					+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
					+ " sum(aa1.init_money) + sum(aa1.in_money) - sum(aa1.out_money) final_money "
					+ " from ( " + sql_a3 + " union all " + sql_a1
					+ " union all " + sql_a2
					+ ") aa1 group by category_code order by category_code";

			Vector vec = new Vector();

			DBConnection con = null;
			DBResult dbrs = null;
			java.sql.ResultSet rs = null;
			try {
				con = DBConnection.open(false);
				dbrs = DBEngine.doSelect(con, all);
				rs = dbrs.getRs();
				while (rs.next()) {
					String[] values = new String[9];
					values[0] = rs.getString("category_code");
					values[1] = rs.getString("init_count");
					values[2] = rs.getString("init_money");
					values[3] = rs.getString("in_count");
					values[4] = rs.getString("in_money");
					values[5] = rs.getString("out_money");
					values[6] = rs.getString("out_money");
					values[7] = rs.getString("final_count");
					values[8] = rs.getString("final_money");
					vec.add(values);
				}
				String date = "";
				if (querytype.equals("1")) {
					date = "统计月:" + start.substring(0, 7); // 显示日期
				} else {
					date = "统计月:" + start.substring(0, 10) + " 至 "
							+ end.substring(0, 10); // 显示日期
				}
				if (vec.size() == 0) {
					isAvaliable = false;
				} else if (vec.size() > 13000) {
					isAvaliable = false;
					isLager = true;
				} else {
					writeExcel_ReportYKProductMonth(vec, warehouseCode, month,
							title, fileName, title1, date, request, response,
							start, end);
				}
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
					if (dbrs != null) {
						dbrs.clear();
					}
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {

					e.printStackTrace();
				} catch (Exception e) {

					e.printStackTrace();
				}
			}

		} else if ("4".equals(title)) {
			if (GSBaseConstants.PLANPRICE.equals("true")) {
				title1 = warehouseName + "仓库产品应付款月报";
			} else {
				title1 = warehouseName + "仓库压库产品应付款月报";
			}
			try {
				ObjectList list = detailquery4Group(warehouseCode, start, end);
				ObjectList trueList = detailquery4true(warehouseCode, start,
						end);
				ObjectList falseList = detailquery4false(warehouseCode, start,
						end);

				String date = "统计月:" + start.substring(0, 7); // 显示日期

				if (list.size() == 0) {
					isAvaliable = false;
				} else if (list.size() > 13000) {
					isAvaliable = false;
					isLager = true;
				} else {
					writeExcel_ReportYKMoneyMonth(title, fileName, list,
							trueList, falseList, title1, date, request,
							response);
				}
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}
		} else if ("5".equals(title) || "11".equals(title)) {
			if (GSBaseConstants.PLANPRICE.equals("true")) {
				title1 = warehouseName + "仓库产品资金进出累计汇总(成本价)";
			} else {
				title1 = warehouseName + "仓库买断产品资金进出累计汇总(成本价)";
			}
			String masterStart = " select "
					+ " aa1.category_code, "
					+ " sum(aa1.init_count) init_count, "
					+ " sum(aa1.init_money) init_money, "
					+ " sum(aa1.in_count) in_count, "
					+ " sum(aa1.in_money) in_money, "
					+ " sum(aa1.in_1002money) in_1002money, "
					+ " sum(aa1.in_money) + sum(aa1.in_1002money) in_moneys, "
					+ " sum(aa1.out_count) out_count, "
					+ " sum(aa1.out_money) out_money, "
					+ " sum(aa1.out_2002money) out_2002money, "
					+ " sum(aa1.out_money) + sum(aa1.out_2002money) out_moneys,  "
					+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
					+ " sum(aa1.init_money) + sum(aa1.in_money) + sum(aa1.in_1002money) - sum(aa1.out_money) - sum(aa1.out_2002money) final_money "
					+ " from( ";

			String masterEnd = " ) aa1 "
					+ " group by category_code order by category_code ";

			String inStart = " select " + " a1.category_code, "
					+ " 0 init_count, " + " 0 init_money, " + " a1.in_count, "
					+ " a1.in_money, " + " a1.in_1002money, "
					+ " 0 out_count, " + " 0 out_money, " + " 0 out_2002money "
					+ " from( ";

			String inEnd = " ) a1 ";

			String inPart1 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(insub.product_count) in_count, "
					+ " sum(insub.product_money) in_money, "
					+ " 0 in_1002money "
					+ " from "
					+ " t_in_sub insub "
					+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
					+ " left outer join t_product product on insub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and inhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and inhead.in_time >= '" + start + "' "
					+ " and inhead.in_time <= '" + end + "' "
					+ " and insub.create_time >= '" + start + "' "
					+ " and insub.create_time <= '" + end + "' "
					+ " and product.category_code <> '90001' "
					+ " and insub.balance_mode = '2' and insub.status = '1'"
					+ " and inhead.in_type = '1001' " + " group by "
					+ " substr(category_code, 1, 1) ";

			String inPart2 = " select "
					+ " category_code, "
					+ " sum(insub.product_count) in_count, "
					+ " sum(insub.product_money) in_money, "
					+ " 0 in_1002money "
					+ " from "
					+ " t_in_sub insub "
					+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
					+ " left outer join t_product product on insub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and inhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and inhead.in_time >= '" + start + "' "
					+ " and inhead.in_time <= '" + end + "' "
					+ " and insub.create_time >= '" + start + "' "
					+ " and insub.create_time <= '" + end + "' "
					+ " and product.category_code = '90001' "
					+ " and insub.balance_mode = '2' and insub.status = '1'"
					+ " and inhead.in_type = '1001' " + " group by "
					+ " category_code ";

			String inPart3 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(insub.product_count) in_count, "
					+ " 0 in_money, "
					+ " sum(insub.product_money) in_1002money "
					+ " from "
					+ " t_in_sub insub "
					+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
					+ " left outer join t_product product on insub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and inhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and inhead.in_time >= '" + start + "' "
					+ " and inhead.in_time <= '" + end + "' "
					+ " and insub.create_time >= '" + start + "' "
					+ " and insub.create_time <= '" + end + "' "
					+ " and product.category_code <> '90001' "
					+ " and insub.balance_mode = '2' and insub.status = '1'"
					+ " and inhead.in_type = '1002' " + " group by "
					+ " substr(category_code, 1, 1) ";

			String inPart4 = " select "
					+ " category_code, "
					+ " sum(insub.product_count) in_count, "
					+ " 0 in_money, "
					+ " sum(insub.product_money) in_1002money "
					+ " from "
					+ " t_in_sub insub "
					+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
					+ " left outer join t_product product on insub.product_id = product.id "
					+ "  where " + " 1 = 1 "
					+ " and inhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and inhead.in_time >= '" + start + "' "
					+ " and inhead.in_time <= '" + end + "' "
					+ " and insub.create_time >= '" + start + "' "
					+ " and insub.create_time <= '" + end + "' "
					+ " and product.category_code = '90001' "
					+ " and insub.balance_mode = '2' and insub.status = '1'"
					+ " and inhead.in_type = '1002' " + " group by "
					+ " category_code ";

			String outStart = " select " + " a2.category_code, "
					+ " 0 init_count, " + " 0 init_money, " + " 0 in_count, "
					+ " 0 in_money, " + " 0 in_1002money, " + " a2.out_count, "
					+ " a2.out_money, " + " a2.out_1002money " + " from( ";

			String outEnd = " ) a2 ";

			String outPart1 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(outsub.product_count) out_count, "
					+ " sum(outsub.product_money) out_money, "
					+ " 0 out_1002money "
					+ " from "
					+ " t_out_sub outsub "
					+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
					+ " left outer join t_product product on outsub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and outhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and outhead.out_time >= '" + start + "' "
					+ " and outhead.out_time <= '" + end + "' "
					+ " and outsub.create_time >= '" + start + "' "
					+ " and outsub.create_time <= '" + end + "' "
					+ " and product.category_code <> '90001' "
					+ " and outsub.balance_mode = '2' and outsub.status = '1'"
					+ " and outhead.out_type = '2001' "
					+ " group by substr(category_code, 1, 1) ";

			String outPart2 = " select "
					+ " category_code, "
					+ " sum(outsub.product_count) out_count, "
					+ " sum(outsub.product_money) out_money, "
					+ " 0 out_1002money "
					+ " from "
					+ " t_out_sub outsub "
					+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
					+ " left outer join t_product product on outsub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and outhead.warehouse_code like '" + warehouseCode
					+ "%' "
					+ " and outhead.out_time >= '" + start + "' "
					+ " and outhead.out_time <= '" + end + "' "
					+ " and outsub.create_time >= '" + start + "' "
					+ " and outsub.create_time <= '" + end + "' "
					+ " and product.category_code = '90001' "
					+ " and outsub.balance_mode = '2' and outsub.status = '1'"
					+ " and outhead.out_type = '2001' "
					+ " group by category_code ";

			String outPart3 = " select "
					+ " substr(category_code, 1, 1) || '0000' category_code, "
					+ " sum(outsub.product_count) out_count, "
					+ " 0 out_money, "
					+ " sum(out_money) out_1002money "
					+ " from "
					+ " t_out_sub outsub "
					+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
					+ " left outer join t_product product on outsub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and outhead.warehouse_code like '" + warehouseCode
					+ "%' " 
					+ " and outhead.out_time >= '" + start + "' "
					+ " and outhead.out_time <= '" + end + "' "
					+ " and outsub.create_time >= '" + start + "' "
					+ " and outsub.create_time <= '" + end + "' "
					+ " and product.category_code <> '90001' "
					+ " and outsub.balance_mode = '2' and outsub.status = '1'"
					+ " and outhead.out_type = '2002' "
					+ " group by substr(category_code, 1, 1) ";

			String outPart4 = " select "
					+ " category_code, "
					+ " sum(outsub.product_count) out_count, "
					+ " 0 out_money, "
					+ " sum(out_money) out_1002money "
					+ " from "
					+ " t_out_sub outsub "
					+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
					+ " left outer join t_product product on outsub.product_id = product.id "
					+ " where " + " 1 = 1 "
					+ " and outhead.warehouse_code like '" + warehouseCode
					+ "%' "
					+ " and outhead.out_time >= '" + start + "' "
					+ " and outhead.out_time <= '" + end + "' "
					+ " and outsub.create_time >= '" + start + "' "
					+ " and outsub.create_time <= '" + end + "' "
					+ " and product.category_code = '90001' "
					+ " and outsub.balance_mode = '2' and outsub.status = '1'"
					+ " and outhead.out_type = '2002' "
					+ " group by category_code ";
			String newMonthStorage = "";
			if(!isType2){
				newMonthStorage = " select "
					+ " a3.category_code, "
					+ " a3.init_count, "
					+ " a3.init_money, "
					+ " 0 in_count, "
					+ " 0 in_money, "
					+ " 0 in_1002money, "
					+ " 0 out_count, "
					+ " 0 out_money, "
					+ " 0 out_2002money "
					+ " from (  "
					+ " select  "
					+ " a22.category_code,  "
					+ " a22.out_count init_count,  "
					+ " a22.out_money init_money,  "
					+ " 0 in_count,  "
					+ " 0 in_money,  "
					+ " 0 in_1002money, "
					+ " 0 out_count,  "
					+ " 0 out_money,  "
					+ " 0 out_1002money  "
					+ " from(    "
					+ " select  "
					+ " substr(category_code, 1, 1) || '0000' category_code,  "
					+ " sum(outsub.product_count) out_count,  "
					+ " sum(outsub.product_money) out_money,  "
					+ " 0 out_1002money  "
					+ " from  "
					+ " t_month_storage outsub  "
					+ " left outer join t_product product on outsub.product_id = product.id  "
					+ " where  " + " 1 = 1  "
					+ " and outsub.warehouse_code like '"
					+ warehouseCode
					+ "%' "
					+ " and outsub.month = '"
					+ dataMonth
					+ "'  "
					+ " and product.category_code <> '90001'  "
					+ " and outsub.balance_mode = '2'  and outsub.status = '1'"
					+ " group by substr(category_code, 1, 1)  "
					+ " union all  "
					+ " select  "
					+ " category_code,  "
					+ " sum(outsub.product_count) out_count,  "
					+ " sum(outsub.product_money) out_money,  "
					+ " 0 out_1002money  "
					+ " from  "
					+ " t_month_storage outsub  "
					+ " left outer join t_product product on outsub.product_id = product.id  "
					+ " where  "
					+ " 1 = 1  "
					+ " and outsub.warehouse_code like '"
					+ warehouseCode
					+ "%' "
					+ " and outsub.month = '"
					+ dataMonth
					+ "'  "
					+ " and product.category_code = '90001'  "
					+ " and outsub.balance_mode = '2'  and outsub.status = '1'"
					+ " group by category_code  "
					+ " ) a22  "
					+ " ) a3 group by category_code ,init_count,init_money ";
			}else{
				newMonthStorage =
					" select "+
					" a3.category_code, "+
					" sum(a3.init_count) + sum(a3.in_count) - sum(a3.out_count) init_count, "+
					" sum(a3.init_money) + sum(a3.in_money) + sum(a3.in_1002money) - sum(a3.out_money) - sum(a3.out_2002money)init_money, "+
					" 0 in_count, "+
					" 0 in_money, "+
					" 0 in_1002money, "+
					" 0 out_count, "+
					" 0 out_money, "+
					" 0 out_2002money "+
					" from (  "+
					" select "+
					" a11.category_code,  "+
					" 0 init_count,  "+
					" 0 init_money,  "+
					" a11.in_count,  "+
					" a11.in_money,  "+
					" a11.in_1002money, "+
					" 0 out_count,  "+
					" 0 out_money,  "+
					" 0 out_2002money  "+
					" from(  "+
					" select  "+
					" substr(category_code, 1, 1) || '0000' category_code,  "+
					" sum(insub.product_count) in_count,  "+
					" sum(insub.product_money) in_money,  "+
					" 0 in_1002money  "+
					" from  "+
					" t_in_sub insub  "+
					" left outer join t_in_head inhead on insub.in_bill_id = inhead.id  "+
					" left outer join t_product product on insub.product_id = product.id  "+
					" where  "+
					" 1 = 1 "+
					" and inhead.warehouse_code like '"+warehouseCode+"%' "+
					" and inhead.in_time >= '"+startType2+"' "+
					" and inhead.in_time <= '"+endType2+"' "+
					" and insub.create_time >= '"+startType2+"' "+
					" and insub.create_time <= '"+endType2+"' "+
					" and product.category_code <> '90001'  "+
					" and insub.balance_mode = '2'  and insub.status = '1'"+
					" group by  "+
					" substr(category_code, 1, 1)   "+
					" union all  "+
					" select  "+
					" category_code,  "+
					" sum(insub.product_count) in_count,  "+
					" sum(insub.product_money) in_money,  "+
					" 0 in_1002money  "+
					" from  "+
					" t_in_sub insub  "+
					" left outer join t_in_head inhead on insub.in_bill_id = inhead.id  "+
					" left outer join t_product product on insub.product_id = product.id  "+
					" where  "+
					" 1 = 1  "+
					" and inhead.warehouse_code like '"+warehouseCode+"%' "+
					" and inhead.in_time >= '"+startType2+"' "+
					" and inhead.in_time <= '"+endType2+"' "+
					" and insub.create_time >= '"+startType2+"' "+
					" and insub.create_time <= '"+endType2+"' "+
					" and product.category_code = '90001'  "+
					" and insub.balance_mode = '2'  and insub.status = '1'"+
					" group by  "+
					" category_code "+
					" ) a11  "+
					" union all  "+
					" select  "+
					" a22.category_code,  "+
					" 0 init_count,  "+
					" 0 init_money,  "+
					" 0 in_count,  "+
					" 0 in_money,  "+
					" 0 in_1002money, "+
					" a22.out_count,  "+
					" a22.out_money,  "+
					" a22.out_1002money  "+
					" from(    "+
					" select  "+
					" substr(category_code, 1, 1) || '0000' category_code,  "+
					" sum(outsub.product_count) out_count,  "+
					" sum(outsub.product_money) out_money,  "+
					" 0 out_1002money  "+
					" from  "+
					" t_out_sub outsub  "+
					" left outer join t_out_head outhead on outsub.out_bill_id = outhead.id  "+
					" left outer join t_product product on outsub.product_id = product.id  "+
					" where  "+
					" 1 = 1  "+
					" and outhead.warehouse_code like '"+warehouseCode+"%' "+
					" and outhead.out_time >= '"+startType2+"' "+
					" and outhead.out_time <= '"+endType2+"' "+
					" and outsub.create_time >= '"+startType2+"' "+
					" and outsub.create_time <= '"+endType2+"' "+
					" and product.category_code <> '90001'  "+
					" and outsub.balance_mode = '2'  and outsub.status = '1'"+
					" group by substr(category_code, 1, 1)  "+
					" union all  "+
					" select  "+
					" category_code,  "+
					" sum(outsub.product_count) out_count,  "+
					" sum(outsub.product_money) out_money,  "+
					" 0 out_1002money  "+
					" from  "+
					" t_out_sub outsub  "+
					" left outer join t_out_head outhead on outsub.out_bill_id = outhead.id  "+
					" left outer join t_product product on outsub.product_id = product.id  "+
					" where  "+
					" 1 = 1  "+
					" and outhead.warehouse_code like '"+warehouseCode+"%' "+
					" and outhead.out_time >= '"+startType2+"' "+
					" and outhead.out_time <= '"+endType2+"' "+
					" and outsub.create_time >= '"+startType2+"' "+
					" and outsub.create_time <= '"+endType2+"' "+
					" and product.category_code = '90001'  "+
					" and outsub.balance_mode = '2'  and outsub.status = '1'"+
					" group by category_code  "+
					" ) a22" +
					" union all  "+
					" select  "
					+ " a33.category_code,  "
					+ " a33.out_count init_count,  "
					+ " a33.out_money init_money,  "
					+ " 0 in_count,  "
					+ " 0 in_money,  "
					+ " 0 in_1002money, "
					+ " 0 out_count,  "
					+ " 0 out_money,  "
					+ " 0 out_1002money  "
					+ " from(    "
					+ " select  "
					+ " substr(category_code, 1, 1) || '0000' category_code,  "
					+ " sum(outsub.product_count) out_count,  "
					+ " sum(outsub.product_money) out_money,  "
					+ " 0 out_1002money  "
					+ " from  "
					+ " t_month_storage outsub  "
					+ " left outer join t_product product on outsub.product_id = product.id  "
					+ " where  " + " 1 = 1  "
					+ " and outsub.warehouse_code like '"
					+ warehouseCode
					+ "%' "
					+ " and outsub.month = '"
					+ dataMonth
					+ "'  "
					+ " and product.category_code <> '90001'  "
					+ " and outsub.balance_mode = '2'  and outsub.status = '1'"
					+ " group by substr(category_code, 1, 1)  "
					+ " union all  "
					+ " select  "
					+ " category_code,  "
					+ " sum(outsub.product_count) out_count,  "
					+ " sum(outsub.product_money) out_money,  "
					+ " 0 out_1002money  "
					+ " from  "
					+ " t_month_storage outsub  "
					+ " left outer join t_product product on outsub.product_id = product.id  "
					+ " where  "
					+ " 1 = 1  "
					+ " and outsub.warehouse_code like '"
					+ warehouseCode
					+ "%' "
					+ " and outsub.month = '"
					+ dataMonth
					+ "'  "
					+ " and product.category_code = '90001'  "
					+ " and outsub.balance_mode = '2'  and outsub.status = '1'"
					+ " group by category_code  "
					+ " ) a33  "
					+" ) a3 group by category_code  ";
			}
				
			
			String all = null;
			all = masterStart + newMonthStorage + " union all " + inStart
					+ inPart1 + "union all " + inPart2 + " union all "
					+ inPart3 + " union all " + inPart4 + inEnd + " union all "
					+ outStart + outPart1 + "union all " + outPart2
					+ " union all " + outPart3 + " union all " + outPart4
					+ outEnd + masterEnd;
			Vector vec = new Vector();
			DBConnection con = null;
			DBResult dbrs = null;
			java.sql.ResultSet rs = null;
			try {
				con = DBConnection.open(false);
				dbrs = DBEngine.doSelect(con, all);
				rs = dbrs.getRs();
				while (rs.next()) {
					String[] values = new String[13];
					values[0] = rs.getString("category_code");
					values[1] = rs.getString("init_count");
					values[2] = rs.getString("init_money");
					values[3] = rs.getString("in_count");
					values[4] = rs.getString("in_money");
					values[5] = rs.getString("in_1002money");
					values[6] = rs.getString("in_moneys");
					values[7] = rs.getString("out_count");
					values[8] = rs.getString("out_money");
					values[9] = rs.getString("out_2002money");
					values[10] = rs.getString("out_moneys");
					values[11] = rs.getString("final_count");
					values[12] = rs.getString("final_money");
					vec.add(values);
				}
				if (vec.size() == 0) {
					isAvaliable = false;
				} else if (vec.size() > 13000) {
					isAvaliable = false;
					isLager = true;
				} else {
					writeExcel_ReportMDMoneyInout(vec, month, warehouseCode,
							title, fileName, title1, start, end, request,
							response);
				}
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
					if (dbrs != null) {
						dbrs.clear();
					}
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {

					e.printStackTrace();
				} catch (Exception e) {

					e.printStackTrace();
				}
			}
		} else if ("6".equals(title)) {
			title1 = "合并库收料清单";
			try {
				ObjectList list = detailquery6Group(warehouseCode,
						inCustomerName, getCustomers, start, end);
				ObjectList listAll = detailquery6All(warehouseCode,
						inCustomerName, getCustomers, start, end);

				if (list.size() == 0) {
					isAvaliable = false;
				} else if (list.size() > 13000) {
					isAvaliable = false;
					isLager = true;

				} else {
					isAvaliable = true;
					writeExcel_ReportCustomerInList(warehouseCode,
							inCustomerName, getCustomers, title, fileName,
							list, listAll, title1, start, end, request,
							response);
				}
			} catch (Exception e) {

			}
		} else if ("7".equals(title) || "12".equals(title)) {
			if (GSBaseConstants.PLANPRICE.equals("true")) {// 湖南巴士按实际价统计
				title1 = "产品分类月进出明细";
			} else {
				title1 = "压库产品分类月进出明细";
			}
			DBConnection con = null;
			DBResult dbrs = null;
			java.sql.ResultSet rs = null;
			Vector vec = null;
			try {
				// SQL语句总和
				String all = null;
				String masterStart = null;
				String masterEnd = null;
				String masterSubStart = null;
				String masterSubEnd = null;
				String monthStorage = null;
				String in = null;
				String out = null;

				masterStart = " select " + " aaa1.*, "
						+ " aaa2.concentricity_code, " + " aaa2.apep_code, "
						+ " aaa2.name, " + " aaa2.spec, " + " aaa2.model, "
						+ " aaa2.product_brand, " + " aaa2.product_unit, "
						+ " cate.name cate_name   " + " from(  ";
				masterSubStart = " select "
						+ " aa1.category_code, "
						+ " aa1.product_id, "
						+ " aa1.product_price, "
						+ // /////////////////
						" sum(aa1.init_count) init_count, "
						+ " sum(aa1.init_money) init_money, "
						+ " sum(aa1.in_count) in_count, "
						+ " sum(aa1.in_money) in_money, "
						+ " sum(aa1.out_count) out_count, "
						+ " sum(aa1.out_money) out_money, "
						+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
						+ " sum(aa1.init_money) + sum(aa1.in_money) - sum(aa1.out_money) final_money "
						+ " from ( ";
				if (!isType2) {
					monthStorage = " select "
							+ " a3.category_code, "
							+ " a3.product_id, "
							+ " a3.product_price, "
							+ // /////////////////
							" sum(a3.init_count) init_count, "
							+ " sum(a3.init_money) init_money, "
							+ " 0 in_count, "
							+ " 0 in_money, "
							+ " 0 out_count, "
							+ " 0 out_money "
							+ " from( "
							+ " select "
							+ " substr(category_code, 1, 1) || '0000' category_code, "
							+ " insub.product_id, "
							+ " insub.product_price, "
							+ // /////////////////
							" sum(product_count) init_count, "
							+ " sum(product_money) init_money "
							+ " from "
							+ " t_month_storage insub "
							+ " left outer join t_product product on insub.product_id = product.id "
							+ " where " + " 1 = 1 " + " and "
							+ " insub.warehouse_code like '"
							+ warehouseCode
							+ "%' "
							+ " and "
							+ " insub.month = '"
							+ dataMonth
							+ "' "
							+ " and "
							+ " product.category_code <> '90001' "
							+ " and "
							+ " insub.balance_mode = '"
							+ ConstDefine.getBalanceModeByFlag()
							+ "' and insub.status = '1'"
							+ " group by "
							+ " product_id,product_price,substr(category_code, 1, 1) "
							+ // //////////////////
							" union all "
							+ " select "
							+ " category_code, "
							+ " insub.product_id, "
							+ " insub.product_price, "
							+ // /////////////////
							" sum(product_count) init_count, "
							+ " sum(product_money) init_money "
							+ " from "
							+ " t_month_storage insub "
							+ " left outer join t_product product on insub.product_id = product.id "
							+ " where "
							+ " 1 = 1 "
							+ " and "
							+ " insub.warehouse_code like '"
							+ warehouseCode
							+ "%' "
							+ " and "
							+ " insub.month = '"
							+ dataMonth
							+ "' "
							+ " and "
							+ " product.category_code = '90001' "
							+ " and "
							+ " insub.balance_mode = '"
							+ ConstDefine.getBalanceModeByFlag()
							+ "' and insub.status = '1'"
							+ " group by "
							+ " product_id,product_price,category_code "
							+ // ////////////////
							" ) a3 "
							+ " group by "
							+ " product_id,product_price,category_code ";// ////////////////////
				} else {
					monthStorage =
						" select "+
						" a3.category_code, "+
						" a3.product_id, "+
						" a3.product_price, "+// /////////////////
						" sum(a3.init_count) init_count, "+
						" sum(a3.init_money) init_money, "+
						" 0 in_count, "+
						" 0 in_money, "+
						" 0 out_count, "+
						" 0 out_money "+
						" from( "+
						" select "+
						" substr(category_code, 1, 1) || '0000' category_code, "+
						" insub.product_id, "+
						" insub.product_price, "+// /////////////////
						" sum(product_count) init_count, "+
						" sum(product_money) init_money "+
						" from "+
						" t_in_sub insub "+
						" left outer join t_in_head inhead on insub.in_bill_id = inhead.id "+
						" left outer join t_product product on insub.product_id = product.id "+
						" where "+
						" 1 = 1 "+
						" and "+
						" inhead.warehouse_code like '"+warehouseCode+"%' "+
						" and inhead.in_time >= '"+startType2+"' "+
						" and inhead.in_time <= '"+endType2+"' "+
						" and insub.create_time >= '"+startType2+"' "+
						" and insub.create_time <= '"+endType2+"' "+
						" and "+
						" product.category_code <> '90001' "+
						" and "+
						" insub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and insub.status = '1'"+
						" group by "+
						" product_id,product_price,substr(category_code, 1, 1) "+   // //////////////////
						" union all "+
						" select "+
						" category_code, "+
						" insub.product_id, "+
						" insub.product_price, "+// /////////////////
						" sum(product_count) init_count, "+
						" sum(product_money) init_money "+
						" from "+
						" t_in_sub insub "+
						" left outer join t_in_head inhead on insub.in_bill_id = inhead.id "+
						" left outer join t_product product on insub.product_id = product.id "+
						" where "+
						" 1 = 1 "+
						" and "+
						" inhead.warehouse_code like '"+warehouseCode+"%' "+
						" and inhead.in_time >= '"+startType2+"' "+
						" and inhead.in_time <= '"+endType2+"' "+
						" and insub.create_time >= '"+startType2+"' "+
						" and insub.create_time <= '"+endType2+"' "+
						" and "+
						" product.category_code = '90001' "+
						" and "+
						" insub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and insub.status = '1'"+
						" group by "+
						" product_id,product_price,category_code "+// ////////////////
						" union all "+
						" select "+
						" substr(category_code, 1, 1) || '0000' category_code, "+
						" outsub.product_id, "+
						" outsub.product_price, "+// /////////////////
						" sum(product_count) * -1 init_count, "+
						" sum(product_money) * -1 init_money "+
						" from "+
						" t_out_sub outsub "+
						" left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "+
						" left outer join t_product product on outsub.product_id = product.id "+
						" where "+
						" 1 = 1 "+
						" and "+
						" outhead.warehouse_code like '"+warehouseCode+"%' "+
						" and outhead.out_time >= '"+startType2+"' "+
						" and outhead.out_time <= '"+endType2+"' "+
						" and outsub.create_time >= '"+startType2+"' "+
						" and outsub.create_time <= '"+endType2+"' "+
						" and "+
						" product.category_code <> '90001' "+
						" and "+
						" outsub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and outsub.status = '1'"+
						" group by "+
						" product_id,product_price,substr(category_code, 1, 1) "+  // //////////////////
						" union all "+
						" select "+
						" category_code, "+
						" outsub.product_id, "+
						" outsub.product_price, "+// /////////////////
						" sum(product_count) * -1 init_count, "+
						" sum(product_money) * -1 init_money "+
						" from "+
						" t_out_sub outsub "+
						" left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "+
						" left outer join t_product product on outsub.product_id = product.id "+
						" where "+
						" 1 = 1 "+
						" and "+
						" outhead.warehouse_code like '"+warehouseCode+"%' "+
						" and outhead.out_time >= '"+startType2+"' "+
						" and outhead.out_time <= '"+endType2+"' "+
						" and outsub.create_time >= '"+startType2+"' "+
						" and outsub.create_time <= '"+endType2+"' "+
						" and "+
						" product.category_code = '90001' "+
						" and "+
						" outsub.balance_mode = '" + ConstDefine.getBalanceModeByFlag() + "' and outsub.status = '1'"+
						" group by "+
						" product_id,product_price,category_code "+
						" union all "+
						"select "
						+ " substr(category_code, 1, 1) || '0000' category_code, "
						+ " insub.product_id, "
						+ " insub.product_price, "
						+ // /////////////////
						" sum(product_count) init_count, "
						+ " sum(product_money) init_money "
						+ " from "
						+ " t_month_storage insub "
						+ " left outer join t_product product on insub.product_id = product.id "
						+ " where " + " 1 = 1 " + " and "
						+ " insub.warehouse_code like '"
						+ warehouseCode
						+ "%' "
						+ " and "
						+ " insub.month = '"
						+ dataMonth
						+ "' "
						+ " and "
						+ " product.category_code <> '90001' "
						+ " and "
						+ " insub.balance_mode = '"
						+ ConstDefine.getBalanceModeByFlag()
						+ "' and insub.status = '1'"
						+ " group by "
						+ " product_id,product_price,substr(category_code, 1, 1) "
						+ // //////////////////
						" union all "
						+ " select "
						+ " category_code, "
						+ " insub.product_id, "
						+ " insub.product_price, "
						+ // /////////////////
						" sum(product_count) init_count, "
						+ " sum(product_money) init_money "
						+ " from "
						+ " t_month_storage insub "
						+ " left outer join t_product product on insub.product_id = product.id "
						+ " where "
						+ " 1 = 1 "
						+ " and "
						+ " insub.warehouse_code like '"
						+ warehouseCode
						+ "%' "
						+ " and "
						+ " insub.month = '"
						+ dataMonth
						+ "' "
						+ " and "
						+ " product.category_code = '90001' "
						+ " and "
						+ " insub.balance_mode = '"
						+ ConstDefine.getBalanceModeByFlag()
						+ "' and insub.status = '1'"
						+ " group by "
						+ " product_id,product_price,category_code "+
						" ) a3 "+
						" group by "+
						" product_id,product_price,category_code ";// ////////////////////
				}
				in = " select "
						+ " a1.category_code, "
						+ " a1.product_id, "
						+ " a1.product_price, "
						+ // /////////////////
						" 0 init_count, "
						+ " 0 init_money, "
						+ " a1.in_count, "
						+ " a1.in_money, "
						+ " 0 out_count, "
						+ " 0 out_money "
						+ " from( "
						+ " select "
						+ " substr(category_code, 1, 1) || '0000' category_code, "
						+ " insub.product_id, "
						+ " insub.product_price, "
						+ // /////////////////
						" sum(insub.product_count) in_count, "
						+ " sum(insub.product_money) in_money "
						+ " from "
						+ " t_in_sub insub "
						+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
						+ " left outer join t_product product on insub.product_id = product.id "
						+ " where " + " 1 = 1 " + " and "
						+ " inhead.warehouse_code like '"
						+ warehouseCode
						+ "%' "
						+ " and "
						+ " inhead.in_time >= '"
						+ start
						+ "' "
						+ " and "
						+ " inhead.in_time <= '"
						+ end
						+ "' "+
						" and insub.create_time >= '"+start+"' "+
						" and insub.create_time <= '"+end+"' "
						+ " and "
						+ " product.category_code <> '90001' "
						+ " and "
						+ " insub.balance_mode = '"
						+ ConstDefine.getBalanceModeByFlag()
						+ "' and insub.status = '1'"
						+ " group by "
						+ " product_id,product_price,substr(category_code, 1, 1) "
						+ // ////////////////
						" union all "
						+ " select "
						+ " category_code, "
						+ " insub.product_id, "
						+ " insub.product_price, "
						+ // /////////////////
						" sum(insub.product_count) in_count, "
						+ " sum(insub.product_money) in_money "
						+ " from "
						+ " t_in_sub insub "
						+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
						+ " left outer join t_product product on insub.product_id = product.id "
						+ " where "
						+ " 1 = 1 "
						+ " and "
						+ " inhead.warehouse_code like '"
						+ warehouseCode
						+ "%' "
						+ " and "
						+ " inhead.in_time >= '"
						+ start
						+ "' "
						+ " and "
						+ " inhead.in_time <= '"
						+ end
						+ "' "+
						" and insub.create_time >= '"+start+"' "+
						" and insub.create_time <= '"+end+"' "
						+ " and "
						+ " product.category_code = '90001' "
						+ " and insub.balance_mode = '"
						+ ConstDefine.getBalanceModeByFlag()
						+ "' and insub.status = '1'"
						+ " group by "
						+ " product_id,product_price,category_code " + // //////////////////////
						" ) a1 ";
				out = " select "
						+ " a2.category_code, "
						+ " a2.product_id, "
						+ " a2.product_price, "
						+ // /////////////////
						" 0 init_count, "
						+ " 0 init_money, "
						+ " 0 in_count, "
						+ " 0 in_money, "
						+ " a2.out_count, "
						+ " a2.out_money "
						+ " from( "
						+ " select "
						+ " substr(category_code, 1, 1) || '0000' category_code, "
						+ " outsub.product_id, "
						+ " outsub.product_price, "
						+ // /////////////////
						" sum(outsub.product_count) out_count, "
						+ " sum(outsub.product_money) out_money "
						+ " from "
						+ " t_out_sub outsub "
						+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
						+ " left outer join t_product product on outsub.product_id = product.id "
						+ " where " + " 1 = 1 " + " and "
						+ " outhead.warehouse_code like '"
						+ warehouseCode
						+ "%' "
						+ " and "
						+ " outhead.out_time >= '"
						+ start
						+ "' "
						+ " and "
						+ " outhead.out_time <= '"
						+ end
						+ "' "+
						" and outsub.create_time >= '"+start+"' "+
						" and outsub.create_time <= '"+end+"' "
						+ " and "
						+ " product.category_code <> '90001' "
						+ " and "
						+ " outsub.balance_mode = '"
						+ ConstDefine.getBalanceModeByFlag()
						+ "' and outsub.status = '1'"
						+ " group by "
						+ " product_id,product_price,substr(category_code, 1, 1) "
						+ // ///////////
						" union all "
						+ " select "
						+ " category_code, "
						+ " outsub.product_id, "
						+ " outsub.product_price, "
						+ // /////////////////
						" sum(outsub.product_count) out_count, "
						+ " sum(outsub.product_money) out_money "
						+ " from "
						+ " t_out_sub outsub "
						+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
						+ " left outer join t_product product on outsub.product_id = product.id "
						+ " where "
						+ " 1 = 1 "
						+ " and "
						+ " outhead.warehouse_code like '"
						+ warehouseCode
						+ "%' "
						+ " and "
						+ " outhead.out_time >= '"
						+ start
						+ "' "
						+ " and "
						+ " outhead.out_time <= '"
						+ end
						+ "' "+
						" and outsub.create_time >= '"+start+"' "+
						" and outsub.create_time <= '"+end+"' "
						+ " and "
						+ " product.category_code = '90001' "
						+ " and "
						+ " outsub.balance_mode = '"
						+ ConstDefine.getBalanceModeByFlag()
						+ "' and outsub.status = '1'"
						+ " group by "
						+ " product_id,product_price,category_code " + // //////////////////
						" ) a2 ";
				masterSubEnd = " ) aa1 group by product_id,product_price,category_code order by category_code ";
				masterEnd = " ) aaa1,t_product aaa2,t_product_category cate "
						+ "where aaa1.product_id = aaa2.id and cate.code = aaa1.category_code "
						+ "order by aaa1.category_code";
				all = masterStart + masterSubStart + monthStorage
						+ " union all " + in + " union all " + out
						+ masterSubEnd + masterEnd;
				con = DBConnection.open(false);
				dbrs = DBEngine.doSelect(con, all);
				rs = dbrs.getRs();
				vec = new Vector();
				// 获得所有的符合查询条件的结果(其中包括所有的类别)
				while (rs.next()) {
					Map map = new HashMap();
					map.put("CATEGORY_CODE", rs.getString("CATEGORY_CODE"));
					map.put("PRODUCT_ID", rs.getString("PRODUCT_ID"));
					map.put("PRODUCT_PRICE", rs.getString("PRODUCT_PRICE"));
					map.put("INIT_COUNT", rs.getString("INIT_COUNT"));
					map.put("INIT_MONEY", rs.getString("INIT_MONEY"));
					map.put("IN_COUNT", rs.getString("IN_COUNT"));
					map.put("IN_MONEY", rs.getString("IN_MONEY"));
					map.put("OUT_COUNT", rs.getString("OUT_COUNT"));
					map.put("OUT_MONEY", rs.getString("OUT_MONEY"));
					map.put("FINAL_COUNT", rs.getString("FINAL_COUNT"));
					map.put("FINAL_MONEY", rs.getString("FINAL_MONEY"));
					map.put("APEP_CODE", rs.getString("APEP_CODE"));
					map.put("NAME", rs.getString("NAME"));
					map.put("SPEC", rs.getString("SPEC"));
					map.put("MODEL", rs.getString("MODEL"));
					map.put("PRODUCT_BRAND", rs.getString("PRODUCT_BRAND"));
					map.put("PRODUCT_UNIT", rs.getString("PRODUCT_UNIT"));
					map.put("CONCENTRICITY_CODE", rs
							.getString("CONCENTRICITY_CODE"));
					map.put("CATE_NAME", rs.getString("CATE_NAME"));
					vec.add(map);
				}
				// EXCEL生成方法
				if (vec.size() == 0) {
					isAvaliable = false;
				} else if (vec.size() > 15000) {
					isAvaliable = false;
					isLager = true;
				} else {
					writeExcel_ReportSeventh(vec, warehouseCode, month, title,
							fileName, title1, request, response, start, end,
							con);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					if (dbrs != null) {
						dbrs.clear();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				try {
					if (con != null) {
						con.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} else if ("8".equals(title) || "13".equals(title)) {
			boolean flag = true;
			List warehouesList = new ArrayList();
			String balance_mode = "";
			String position = "";
			if ("13".equals(title)) {
				flag = false;
				warehouesList = WarehouseCategory
						.getWarehouseCode(warehouseCode);
				balance_mode = request.getParameter("balanceMode");
				position = request.getParameter("positionCode");
			} else {
				warehouesList = WarehouseCategory
						.getWarehouseCode(warehouseCode);
				// warehouesList =
				// WarehouseCategory.getWarehouseCodeByParentCode(warehouseCode);
			}

			int size = 0;
			if (warehouesList != null && warehouesList.size() > 0) {
				size = warehouesList.size();
			}
			int totalSize = 0;
			DBConnection con = null;
			DBResult dbrs = null;
			java.sql.ResultSet rs = null;
			List fullList = new ArrayList();
			try {
				con = DBConnection.open(false);
				for (int i = 0; i < size; i++) {
					String[] currentWarehouseCode = (String[]) warehouesList
							.get(i);
					String supperWarehouseCode = currentWarehouseCode[0].trim()
							.length() > 6 ? currentWarehouseCode[0].trim()
							.substring(0, currentWarehouseCode[0].length() - 2)
							: currentWarehouseCode[0];

					// 判断是否是共享数据的仓库编码
					GSAutoAuditongDateConfigurator.getInstance();
					if (!GSAutoAuditongDateConfigurator
							.isShareDatesWarehouses(supperWarehouseCode)) {
						supperWarehouseCode = currentWarehouseCode[0];
					}

					String tSupperWarehouseCodeOfNoShareProductProperty = currentWarehouseCode[0]
							.trim().length() > 6 ? currentWarehouseCode[0]
							.trim().substring(0,
									currentWarehouseCode[0].length() - 2)
							: currentWarehouseCode[0];
					;
					
					if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
						tSupperWarehouseCodeOfNoShareProductProperty=currentWarehouseCode[0];
					}

					// 加入是否共享产品属性判断
					if (GSAutoAuditongDateConfigurator
							.isNoShareWarehouseProductDatesWarehouses(tSupperWarehouseCodeOfNoShareProductProperty)) {
						tSupperWarehouseCodeOfNoShareProductProperty = currentWarehouseCode[0];
					}
					String masterstart = " select "
							+ " aa1.category_code, "
							+ " aa1.parent_category_code, "
							+ " aa1.category_name, "
							+ " sum(aa1.init_count) init_count, "
							+ " sum(aa1.init_money) init_money, "
							+ " sum(aa1.in_count) in_count, "
							+ " sum(aa1.in_money) in_money, "
							+ " sum(aa1.in_1002money) in_1002money, "
							+ " sum(aa1.in_money) + sum(aa1.in_1002money) in_moneys, "
							+ " sum(aa1.out_count) out_count, "
							+ " sum(aa1.out_money) out_money, "
							+ " sum(aa1.out_2002money) out_2002money, "
							+ " sum(aa1.out_money) + sum(aa1.out_2002money) out_moneys, "
							+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
							+ " sum(aa1.init_money) + sum(aa1.in_money) + sum(aa1.in_1002money) - sum(aa1.out_money) - sum(aa1.out_2002money) final_money "
							+ " from( ";
					String monthstorage = "";
					if (!isType2) {
						monthstorage = " select "
								+ " wcr.category_code, "
								+ " wc.parent_category_code, "
								+ " wc.category_name, "
								+ " sum(ms.product_count) init_count, "
								+ " sum(ms.product_money) init_money, "
								+ " 0 in_count, "
								+ " 0 in_money, "
								+ " 0 in_1002money, "
								+ " 0 out_count, "
								+ " 0 out_money, "
								+ " 0 out_2002money "
								+ " from "
								+ " t_month_storage ms "
								+ " left outer join t_warehouse_category_relation wcr on upper(ms.product_code) = upper(wcr.product_code) "
								+ " left outer join t_warehouse_category wc on wcr.category_code = wc.category_code "
								+ " where " + " 1 = 1 " + " and "
								+ " ms.warehouse_code like '"
								+ currentWarehouseCode[0] + "%' " + " and "
								+ " ms.month = '" + dataMonth + "' ";
						if (flag) {
							monthstorage = monthstorage
									+ " and  ms.balance_mode = '2' ";

						} else {
							if (balance_mode != null
									& balance_mode.trim().length() > 0) {
								monthstorage += " and ms.balance_mode = '"
										+ balance_mode.trim() + "' ";
							}
							if (position != null & position.trim().length() > 0) {
								monthstorage += " and ms.position_code = '"
										+ position.trim() + "' ";
							}
						}
						monthstorage = monthstorage
								+ " and "
								+ " wc.warehouse_code like '"
								+ supperWarehouseCode
								+ "%' and ms.status = '1'"
								+ " and wcr.warehouse_code like '"
								+ tSupperWarehouseCodeOfNoShareProductProperty
								+ "%' "
								+ " group by "
								+ " wc.parent_category_code,wcr.category_code,wc.category_name ";
					} else {
						monthstorage =
							" select "+
							" a.category_code, "+
							" a.parent_category_code, "+
							" a.category_name, "+
							" sum(a.init_count) + sum(a.in_count) - sum(a.out_count) init_count, "+
							" sum(a.init_money) + sum(a.in_money) + sum(a.in_1002money) - sum(a.out_money) - sum(a.out_2002money)init_money, "+
							" 0 in_count, "+
							" 0 in_money, "+
							" 0 in_1002money, "+
							" 0 out_count, "+
							" 0 out_money, "+
							" 0 out_2002money "+
							" from ( "+
							" select "+
							" wcr.category_code, "+
							" wc.parent_category_code, "+
							" wc.category_name, "+
							" 0 init_count, "+
							" 0 init_money, "+
							" sum(insub.product_count) in_count, "+
							" sum(insub.product_money) in_money, "+
							" 0 in_1002money, "+
							" 0 out_count, "+
							" 0 out_money, "+
							" 0 out_2002money "+
							" from "+
							" t_in_sub insub "+
							" left outer join t_in_head inhead on insub.in_bill_id = inhead.id "+
							" left outer join t_warehouse_category_relation wcr on upper(insub.product_code) = upper(wcr.product_code) "+
							" left outer join t_warehouse_category wc on wcr.category_code = wc.category_code "+
							" where "+
							" 1 = 1 "+
							" and "+
							" inhead.warehouse_code like '"+currentWarehouseCode[0]+"%' "+
							" and  inhead.in_time >= '"+startType2+"' "+
							" and  inhead.in_time <= '"+endType2+"' "+
							" and  insub.create_time >= '"+startType2+"' "+
						    " and  insub.create_time <= '"+endType2+"' ";
						
						if(flag){
							monthstorage = monthstorage+" and  insub.balance_mode = '2' ";

						}else{
							if(balance_mode!=null&balance_mode.trim().length()>0){
								monthstorage += " and insub.balance_mode = '"+balance_mode.trim()+"' ";
							}
							if(position!=null&position.trim().length()>0){
								monthstorage += " and insub.position_code = '"+position.trim()+"' ";
							}
						}
						monthstorage = monthstorage+
						" and "+
						" wc.warehouse_code like '"+supperWarehouseCode+"%' and insub.status = '1'"+
						" and wcr.warehouse_code like '"+tSupperWarehouseCodeOfNoShareProductProperty+"%' "+
						" group by "+
						" wc.parent_category_code,wcr.category_code,wc.category_name "+

						" union all "+

						" select "+
						" wcr.category_code, "+
						" wc.parent_category_code, "+
						" wc.category_name, "+
						" 0 init_count, "+
						" 0 init_money, "+
						" 0 in_count, "+
						" 0 in_money, "+
						" 0 in_1002money, "+
						" sum(outsub.product_count) out_count, "+
						" sum(outsub.product_money) out_money, "+
						" 0 out_1002money "+
						" from "+
						" t_out_sub outsub "+
						" left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "+
						" left outer join t_warehouse_category_relation wcr on upper(outsub.product_code) = upper(wcr.product_code) "+
						" left outer join t_warehouse_category wc on wcr.category_code = wc.category_code "+
						" where "+
						" 1 = 1 "+
						" and "+
						" outhead.warehouse_code like '"+currentWarehouseCode[0]+"%' "+
						" and  outhead.out_time >= '"+startType2+"' "+
						" and  outhead.out_time <= '"+endType2+"' "+
						" and  outsub.create_time >= '"+startType2+"' "+
					    " and  outsub.create_time <= '"+endType2+"' ";
						if(flag){
							monthstorage = monthstorage+" and outsub.balance_mode = '2' ";
						}else{
							if(balance_mode!=null&balance_mode.trim().length()>0){
								monthstorage += " and outsub.balance_mode = '"+balance_mode.trim()+"' ";
							}
							if(position!=null&position.trim().length()>0){
								monthstorage += " and outsub.position_code = '"+position.trim()+"' ";
							}
						}
						monthstorage = monthstorage+
						" and "+
						" wc.warehouse_code like '"+supperWarehouseCode+"%' and outsub.status = '1'"+
						" and wcr.warehouse_code like '"+tSupperWarehouseCodeOfNoShareProductProperty+"%' "+
						" group by "+
						" wc.parent_category_code,wcr.category_code,wc.category_name "+
						" union all "+
						  " select "
							+ " wcr.category_code, "
							+ " wc.parent_category_code, "
							+ " wc.category_name, "
							+ " sum(ms.product_count) init_count, "
							+ " sum(ms.product_money) init_money, "
							+ " 0 in_count, "
							+ " 0 in_money, "
							+ " 0 in_1002money, "
							+ " 0 out_count, "
							+ " 0 out_money, "
							+ " 0 out_2002money "
							+ " from "
							+ " t_month_storage ms "
							+ " left outer join t_warehouse_category_relation wcr on upper(ms.product_code) = upper(wcr.product_code) "
							+ " left outer join t_warehouse_category wc on wcr.category_code = wc.category_code "
							+ " where " + " 1 = 1 " + " and "
							+ " ms.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' " + " and "
							+ " ms.month = '" + dataMonth + "' ";
					if (flag) {
						monthstorage = monthstorage
								+ " and  ms.balance_mode = '2' ";

					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							monthstorage += " and ms.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							monthstorage += " and ms.position_code = '"
									+ position.trim() + "' ";
						}
					}
					monthstorage = monthstorage
							+ " and "
							+ " wc.warehouse_code like '"
							+ supperWarehouseCode
							+ "%' and ms.status = '1'"
							+ " and wcr.warehouse_code like '"
							+ tSupperWarehouseCodeOfNoShareProductProperty
							+ "%' "
							+ " group by "
							+ " wc.parent_category_code,wcr.category_code,wc.category_name "+
						" ) a "+
						" group by parent_category_code,category_code,category_name ";	
					}
					String instart = " select " + " a1.category_code, "
							+ " a1.parent_category_code, "
							+ " a1.category_name, " + " 0 init_count, "
							+ " 0 init_money, " + " a1.in_count, "
							+ " a1.in_money, " + " a1.in_1002money, "
							+ " 0 out_count, " + " 0 out_money, "
							+ " 0 out_2002money   " + " from( ";

					String inpart = " select "
							+ " wcr.category_code, "
							+ " wc.parent_category_code, "
							+ " wc.category_name, "
							+ " sum(insub.product_count) in_count, "
							+ " sum(insub.product_money) in_money, "
							+ " 0 in_1002money "
							+ " from "
							+ " t_in_sub insub "
							+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
							+ " left outer join t_warehouse_category_relation wcr on upper(insub.product_code) = upper(wcr.product_code) ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
							inpart+=" and inhead.warehouse_code=wcr.warehouse_code ";
							}
							inpart+= " left outer join t_warehouse_category wc on wcr.category_code = wc.category_code ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
								inpart+="  and inhead.warehouse_code=wc.warehouse_code  ";
							}	
								
							inpart+= " where " + " 1 = 1 " + " and "
							+ " inhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' " + " and "
							+ " inhead.in_time >= '" + start + "' " + " and "
							+ " inhead.in_time <= '" + end + "' "+ " and "
							+ " insub.create_time >= '" + start + "' " + " and "
							+ " insub.create_time <= '" + end + "' "
							+ " and wcr.warehouse_code like '"
							+ tSupperWarehouseCodeOfNoShareProductProperty
							+ "%' " + " and " + " wc.warehouse_code like '"
							+ supperWarehouseCode + "%' ";
					if (flag) {
						inpart += " and  insub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							inpart += " and insub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							inpart += " and insub.position_code = '"
									+ position.trim() + "' ";
						}
					}

					inpart = inpart
							+ " and "
							+ " inhead.in_type = '1001' and insub.status = '1'"
							+ " group by "
							+ " wc.parent_category_code,wcr.category_code,wc.category_name "
							+

							" union all "
							+

							" select "
							+ " wcr.category_code, "
							+ " wc.parent_category_code, "
							+ " wc.category_name, "
							+ " sum(insub.product_count) in_count,  0 in_money, "
							+ " sum(insub.product_money) in_1002money "
							+ " from "
							+ " t_in_sub insub "
							+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
							+ " left outer join t_warehouse_category_relation wcr on upper(insub.product_code) = upper(wcr.product_code) ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
								inpart+=" and inhead.warehouse_code=wcr.warehouse_code ";
							}
							inpart+=" left outer join t_warehouse_category wc on wcr.category_code = wc.category_code and inhead.warehouse_code=wc.warehouse_code  ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
									inpart+=" and inhead.warehouse_code=wc.warehouse_code ";
							}
							inpart+=" where " + " 1 = 1 " + " and "
							+ " inhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' " + " and "
							+ " inhead.in_time >= '" + start + "' " + " and "
							+ " inhead.in_time <= '" + end + "' "+ " and "
							+ " insub.create_time >= '" + start + "' " + " and "
							+ " insub.create_time <= '" + end + "' "
							+ " and wcr.warehouse_code like '"
							+ tSupperWarehouseCodeOfNoShareProductProperty
							+ "%' " + " and " + " wc.warehouse_code like '"
							+ supperWarehouseCode + "%' ";
					if (flag) {
						inpart = inpart + " and  insub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							inpart += " and insub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							inpart += " and insub.position_code = '"
									+ position.trim() + "' ";
						}
					}
					inpart = inpart
							+ " and "
							+ " inhead.in_type = '1002' and insub.status = '1'"
							+ " group by "
							+ " wc.parent_category_code,wcr.category_code,wc.category_name ";

					String inend = " ) a1 ";

					String outstart = " select " + " a2.category_code, "
							+ " a2.parent_category_code, "
							+ " a2.category_name, " + " 0 init_count, "
							+ " 0 init_money, " + " 0 in_count, "
							+ " 0 in_money, " + " 0 in_1002money, "
							+ " a2.out_count, " + " a2.out_money, "
							+ " a2.out_1002money " + " from(  ";

					String outpart = " select "
							+ " wcr.category_code, "
							+ " wc.parent_category_code, "
							+ " wc.category_name, "
							+ " sum(outsub.product_count) out_count, "
							+ " sum(outsub.product_money) out_money, "
							+ " 0 out_1002money "
							+ " from "
							+ " t_out_sub outsub "
							+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
							+ " left outer join t_warehouse_category_relation wcr on upper(outsub.product_code) = upper(wcr.product_code)  ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
								outpart+="  and outhead.warehouse_code=wcr.warehouse_code ";
							}
							outpart+= " left outer join t_warehouse_category wc on wcr.category_code = wc.category_code ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
								outpart+="  and outhead.warehouse_code=wc.warehouse_code  ";
							}
							outpart+= " where " + " 1 = 1 "
							+ " and outhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ " and outhead.out_time >= '" + start + "' "
							+ " and outhead.out_time <= '" + end + "' "
							+ " and outsub.create_time >= '" + start + "' "
							+ " and outsub.create_time <= '" + end + "' "
							+ " and wcr.warehouse_code like '"
							+ tSupperWarehouseCodeOfNoShareProductProperty
							+ "%' " + " and wc.warehouse_code like '"
							+ supperWarehouseCode + "%' ";
					if (flag) {
						outpart = outpart + " and outsub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							outpart += " and outsub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							outpart += " and outsub.position_code = '"
									+ position.trim() + "' ";
						}
					}
					outpart = outpart
							+ " and outhead.out_type <> '2002' and outsub.status = '1'"//不包含盘盈的数据
							+ " group by "
							+ " wc.parent_category_code,wcr.category_code,wc.category_name "
							+

							" union all "
							+

							" select "
							+ " wcr.category_code, "
							+ " wc.parent_category_code, "
							+ " wc.category_name, "
							+ " sum(outsub.product_count) out_count,  0 out_money, "
							+ " sum(out_money) out_1002money "
							+ " from "
							+ " t_out_sub outsub "
							+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
							+ " left outer join t_warehouse_category_relation wcr on upper(outsub.product_code) = upper(wcr.product_code) ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
								outpart+="  and outhead.warehouse_code=wcr.warehouse_code ";
							}
							outpart+= " left outer join t_warehouse_category wc on wcr.category_code = wc.category_code  ";
							if("000004".equals(tSupperWarehouseCodeOfNoShareProductProperty.substring(0,6))){
									outpart+=" and outhead.warehouse_code=wc.warehouse_code ";
							}
							outpart+=" where " + " 1 = 1 "
							+ " and outhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ " and outhead.out_time >= '" + start + "' "
							+ " and outhead.out_time <= '" + end + "' "
							+ " and outsub.create_time >= '" + start + "' "
							+ " and outsub.create_time <= '" + end + "' "

							+ " and wcr.warehouse_code like '"
							+ tSupperWarehouseCodeOfNoShareProductProperty
							+ "%' " + " and wc.warehouse_code like '"
							+ supperWarehouseCode + "%' ";
					if (flag) {
						outpart = outpart + " and outsub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							outpart += " and outsub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							outpart += " and outsub.position_code = '"
									+ position.trim() + "' ";
						}
					}
					outpart = outpart
							+ " and outhead.out_type = '2002' and outsub.status = '1'"
							+ " group by "
							+ " wc.parent_category_code,wcr.category_code,wc.category_name ";

					String outend = " ) a2 ";
					String masterend = " ) aa1  group by parent_category_code,category_code,category_name order by parent_category_code,category_code ";

					String all = null;
					all = masterstart + monthstorage + " union all " + instart
							+ inpart + inend + " union all " + outstart
							+ outpart + outend + masterend;
					List vec = new ArrayList();
					dbrs = DBEngine.doSelect(con, all);
					rs = dbrs.getRs();
					vec.add(currentWarehouseCode);
					while (rs.next()) {
						totalSize++;
						String[] values = new String[15];
						values[0] = rs.getString("category_code");
						values[1] = rs.getString("init_count");
						values[2] = rs.getString("init_money");
						values[3] = rs.getString("in_count");
						values[4] = rs.getString("in_money");
						values[5] = rs.getString("in_1002money");
						values[6] = rs.getString("in_moneys");
						values[7] = rs.getString("out_count");
						values[8] = rs.getString("out_money");
						values[9] = rs.getString("out_2002money");
						values[10] = rs.getString("out_moneys");
						values[11] = rs.getString("final_count");
						values[12] = rs.getString("final_money");
						values[13] = rs.getString("parent_category_code");
						values[14] = rs.getString("category_name");
						vec.add(values);
					}
					fullList.add(vec);
				}
			} catch (Exception e2) {
				LogWriter.error(e2.getMessage());
				System.out.println(e2.getMessage());
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
					if (dbrs != null) {
						dbrs.clear();
					}
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (warehouesList == null) {
				isAvaliable = false;
			} else if (totalSize > 13000) {
				isAvaliable = false;
				isLager = true;
			} else {
				if (flag) {
					writeExcel_ReportMDWCMoneyInout(fullList, month,
							warehouseCode, fileName, start, end, request,
							response);
				} else {
					writeExcel_ReportWCMoneyInout(fullList, month,
							warehouseCode, fileName, start, end, request,
							response);
				}

			}
		} else if ("14".equals(title)) {
			// 构建SQL语句
			String sql = " select"
					+ " warehouse_code,"
					+ " t_warehouse.name,"
					+ " balance_mode,"
					+ " sum(init_money) init_money,"
					+ " sum(in_money) in_money,"
					+ " sum(out_money) out_money,"
					+ " sum(in_and_out_money) in_and_out_money,"
					+ " sum(init_money) + sum(in_money) - sum(out_money) + sum(final_money) final_money,"
					+ " sum(in_bill_count) in_bill_count,"
					+ " sum(out_bill_count) out_bill_count,"
					+ " sum(in_and_out_bill_count) in_and_out_bill_count"
					+ " from ("
					+
					// 期初金额统计 开始
					" select" + " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " sum(sub.product_money) init_money," + " 0 in_money,"
					+ " 0 out_money," + " 0 in_and_out_money,"
					+ " 0 final_money," + " 0 in_bill_count,"
					+ " 0 out_bill_count," + " 0 in_and_out_bill_count"
					+ " from" + " t_in_sub sub"
					+ " left outer join t_in_head head"
					+ " on sub.in_bill_code = head.in_bill_code" + " where"
					+ " sub.status = 1" + " and head.in_time < '"
					+ start
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+

					" union all"
					+

					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " sum(sub.product_money) * -1 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_out_sub sub"
					+ " left outer join t_out_head head"
					+ " on sub.out_bill_code = head.out_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.out_time < '"
					+ start
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 期初金额统计 结束
					" union all"
					+
					// 入库金额统计 开始
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " sum(sub.product_money) in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_in_sub sub"
					+ " left outer join t_in_head head"
					+ " on sub.in_bill_code = head.in_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.in_time >= '"
					+ start
					+ "'"
					+ " and head.in_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 入库金额统计 结束
					" union all"
					+
					// 出库金额统计 开始
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " sum(sub.product_money) out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_out_sub sub"
					+ " left outer join t_out_head head"
					+ " on sub.out_bill_code = head.out_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.out_time >= '"
					+ start
					+ "'"
					+ " and head.out_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 出库金额统计 结束
					" union all"
					+
					// 入出库金额合计统计 开始
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " sum(sub.product_money) in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_in_sub sub"
					+ " left outer join t_in_head head"
					+ " on sub.in_bill_code = head.in_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.in_time >= '"
					+ start
					+ "'"
					+ " and head.in_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+ " union all"
					+ " select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " sum(sub.product_money) in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_out_sub sub"
					+ " left outer join t_out_head head"
					+ " on sub.out_bill_code = head.out_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.out_time >= '"
					+ start
					+ "'"
					+ " and head.out_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 入出库金额合计统计 结束
					" union all"
					+
					// 期末金额统计 结束
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " sum(sub.product_money) final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_in_sub sub"
					+ " left outer join t_in_head head"
					+ " on sub.in_bill_code = head.in_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.in_time > '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+ " union all"
					+ " select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " sum(sub.product_money) * -1 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_out_sub sub"
					+ " left outer join t_out_head head"
					+ " on sub.out_bill_code = head.out_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.out_time > '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 期末金额统计 开始
					" union all"
					+
					// 入库单据统计 开始
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " count(head.in_bill_code) in_bill_count,"
					+ " 0 out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_in_sub sub"
					+ " left outer join t_in_head head"
					+ " on sub.in_bill_code = head.in_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.in_time >= '"
					+ start
					+ "'"
					+ " and head.in_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 入库单据统计 结束
					" union all"
					+
					// 出库单据统计 开始
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " count(head.out_bill_code) out_bill_count,"
					+ " 0 in_and_out_bill_count"
					+ " from"
					+ " t_out_sub sub"
					+ " left outer join t_out_head head"
					+ " on sub.out_bill_code = head.out_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.out_time >= '"
					+ start
					+ "'"
					+ " and head.out_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 出库单据统计 结束
					" union all"
					+
					// 出入库单据合计统计 开始
					" select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " count(head.in_bill_code) in_and_out_bill_count"
					+ " from"
					+ " t_in_sub sub"
					+ " left outer join t_in_head head"
					+ " on sub.in_bill_code = head.in_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.in_time >= '"
					+ start
					+ "'"
					+ " and head.in_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+ " union all"
					+ " select"
					+ " head.warehouse_code warehouse_code,"
					+ " sub.balance_mode balance_mode,"
					+ " 0 init_money,"
					+ " 0 in_money,"
					+ " 0 out_money,"
					+ " 0 in_and_out_money,"
					+ " 0 final_money,"
					+ " 0 in_bill_count,"
					+ " 0 out_bill_count,"
					+ " count(head.out_bill_code) in_and_out_bill_count"
					+ " from"
					+ " t_out_sub sub"
					+ " left outer join t_out_head head"
					+ " on sub.out_bill_code = head.out_bill_code"
					+ " where"
					+ " sub.status = 1"
					+ " and head.out_time >= '"
					+ start
					+ "'"
					+ " and head.out_time <= '"
					+ end
					+ "'"
					+ " group by"
					+ " head.warehouse_code,sub.balance_mode"
					+
					// 出入库单据合计统计 结束
					" ) report,t_warehouse"
					+ " where"
					+ " report.warehouse_code = t_warehouse.code"
					+ " group by"
					+ " report.warehouse_code,t_warehouse.name,report.balance_mode"
					+ " order by"
					+ " report.warehouse_code,report.balance_mode";
			// 查询数据库
			List list = new ArrayList();
			DBConnection con = null;
			DBResult dbrs = null;
			ResultSet rs = null;
			try {
				con = DBConnection.open(false);
				dbrs = DBEngine.doSelect(con, sql);
				rs = dbrs.getRs();
				while (rs.next()) {
					Map map = new HashMap();
					map.put("WAREHOUSE_CODE", rs.getString("WAREHOUSE_CODE"));
					map.put("NAME", rs.getString("NAME"));
					map.put("BALANCE_MODE", rs.getString("BALANCE_MODE"));
					map.put("INIT_MONEY", rs.getString("INIT_MONEY"));
					map.put("IN_MONEY", rs.getString("IN_MONEY"));
					map.put("OUT_MONEY", rs.getString("OUT_MONEY"));
					map.put("IN_AND_OUT_MONEY", rs
							.getString("IN_AND_OUT_MONEY"));
					map.put("FINAL_MONEY", rs.getString("FINAL_MONEY"));
					map.put("IN_BILL_COUNT", rs.getString("IN_BILL_COUNT"));
					map.put("OUT_BILL_COUNT", rs.getString("OUT_BILL_COUNT"));
					map.put("IN_AND_OUT_BILL_COUNT", rs
							.getString("IN_AND_OUT_BILL_COUNT"));
					list.add(map);
				}
				if (list.size() == 0) {
					isAvaliable = false;
				} else if (list.size() > 13000) {
					isAvaliable = false;
					isLager = true;
				} else {
					writeExcel(list, fileName, response, sYear, sMonth);
				}
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
					if (dbrs != null) {
						dbrs.clear();
					}
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}else if("20".equals(title)){
			boolean flag = true;
			List warehouesList = new ArrayList();
			String balance_mode = "";
			String position = "";
			if ("20".equals(title)) {
				flag = false;
				warehouesList = WarehouseCategory
						.getWarehouseCode(warehouseCode);
				balance_mode = request.getParameter("balanceMode");
			} else {
				warehouesList = WarehouseCategory
						.getWarehouseCode(warehouseCode);
				// warehouesList =
				// WarehouseCategory.getWarehouseCodeByParentCode(warehouseCode);
			}

			int size = 0;
			if (warehouesList != null && warehouesList.size() > 0) {
				size = warehouesList.size();
			}
			int totalSize = 0;
			DBConnection con = null;
			DBResult dbrs = null;
			java.sql.ResultSet rs = null;
			List fullList = new ArrayList();
			try {
				con = DBConnection.open(false);
				for (int i = 0; i < size; i++) {
					String[] currentWarehouseCode = (String[]) warehouesList
							.get(i);
					String supperWarehouseCode = currentWarehouseCode[0].trim()
							.length() > 6 ? currentWarehouseCode[0].trim()
							.substring(0, currentWarehouseCode[0].length() - 2)
							: currentWarehouseCode[0];

					// 判断是否是共享数据的仓库编码
					GSAutoAuditongDateConfigurator.getInstance();
					if (!GSAutoAuditongDateConfigurator
							.isShareDatesWarehouses(supperWarehouseCode)) {
						supperWarehouseCode = currentWarehouseCode[0];
					}

					String tSupperWarehouseCodeOfNoShareProductProperty = currentWarehouseCode[0]
							.trim().length() > 6 ? currentWarehouseCode[0]
							.trim().substring(0,
									currentWarehouseCode[0].length() - 2)
							: currentWarehouseCode[0];
					;

					// 加入是否共享产品属性判断
					if (GSAutoAuditongDateConfigurator
							.isNoShareWarehouseProductDatesWarehouses(tSupperWarehouseCodeOfNoShareProductProperty)) {
						tSupperWarehouseCodeOfNoShareProductProperty = currentWarehouseCode[0];
					}
					String masterstart = " select "
							+ " aa1.product_type, "
							+ " sum(aa1.init_count) init_count, "
							+ " sum(aa1.init_money) init_money, "
							+ " sum(aa1.in_count) in_count, "
							+ " sum(aa1.in_money) in_money, "
							+ " sum(aa1.in_1002money) in_1002money, "
							+ " sum(aa1.in_money) + sum(aa1.in_1002money) in_moneys, "
							+ " sum(aa1.out_count) out_count, "
							+ " sum(aa1.out_money) out_money, "
							+ " sum(aa1.out_2002money) out_2002money, "
							+ " sum(aa1.out_money) + sum(aa1.out_2002money) out_moneys, "
							+ " sum(aa1.init_count) + sum(aa1.in_count) - sum(aa1.out_count) final_count, "
							+ " sum(aa1.init_money) + sum(aa1.in_money) + sum(aa1.in_1002money) - sum(aa1.out_money) - sum(aa1.out_2002money) final_money "
							+ " from( ";
					String monthstorage = "";
					if (!isType2) {
						monthstorage = " select "
								+ " pt.product_type, "
								+ " sum(ms.product_count) init_count, "
								+ " sum(ms.product_money) init_money, "
								+ " 0 in_count, "
								+ " 0 in_money, "
								+ " 0 in_1002money, "
								+ " 0 out_count, "
								+ " 0 out_money, "
								+ " 0 out_2002money "
								+ " from "
								+ " t_month_storage ms "
								+ " LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = ms.PRODUCT_ID    "
								+ " where " + " 1 = 1 " + " and "
								+ " ms.warehouse_code like '"
								+ currentWarehouseCode[0] + "%' " + " and "
								+ " ms.month = '" + dataMonth + "' "
								+ " and pt.status=1 ";
						if (flag) {
							monthstorage = monthstorage
									+ " and  ms.balance_mode = '2' ";

						} else {
							if (balance_mode != null
									& balance_mode.trim().length() > 0) {
								monthstorage += " and ms.balance_mode = '"
										+ balance_mode.trim() + "' ";
							}
							if (position != null & position.trim().length() > 0) {
								monthstorage += " and ms.position_code = '"
										+ position.trim() + "' ";
							}
						}
						monthstorage = monthstorage
								+ " and ms.status = '1'"
								+ " group by "
								+ " pt.product_type ";
					} else {
						monthstorage =
							" select "+
							" a.product_type, "+
							" sum(a.init_count) + sum(a.in_count) - sum(a.out_count) init_count, "+
							" sum(a.init_count) + sum(a.in_money) + sum(a.in_1002money) - sum(a.out_money) - sum(a.out_2002money)init_money, "+
							" 0 in_count, "+
							" 0 in_money, "+
							" 0 in_1002money, "+
							" 0 out_count, "+
							" 0 out_money, "+
							" 0 out_2002money "+
							" from ( "+
							" select "+
							" pt.product_type, "+
							" 0 init_count, "+
							" 0 init_money, "+
							" sum(insub.product_count) in_count, "+
							" sum(insub.product_money) in_money, "+
							" 0 in_1002money, "+
							" 0 out_count, "+
							" 0 out_money, "+
							" 0 out_2002money "+
							" from "+
							" t_in_sub insub "+
							" left outer join t_in_head inhead on insub.in_bill_id = inhead.id "+
							" LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = insub.PRODUCT_ID    "+
							" where "+
							" 1 = 1 "+
							" and "+
							" inhead.warehouse_code like '"+currentWarehouseCode[0]+"%' "+
							" and  inhead.in_time >= '"+startType2+"' "+
							" and  inhead.in_time <= '"+endType2+"' "+
							" and  insub.create_time >= '"+startType2+"' "+
						    " and  insub.create_time <= '"+endType2+"' "+ 
							" and pt.status=1 ";
						if(flag){
							monthstorage = monthstorage+" and  insub.balance_mode = '2' ";

						}else{
							if(balance_mode!=null&balance_mode.trim().length()>0){
								monthstorage += " and insub.balance_mode = '"+balance_mode.trim()+"' ";
							}
							if(position!=null&position.trim().length()>0){
								monthstorage += " and insub.position_code = '"+position.trim()+"' ";
							}
						}
						monthstorage = monthstorage+
						" group by "+
						" pt.product_type "+

						" union all "+

						" select "+
						"  pt.product_type, "+
						" 0 init_count, "+
						" 0 init_money, "+
						" 0 in_count, "+
						" 0 in_money, "+
						" 0 in_1002money, "+
						" sum(outsub.product_count) out_count, "+
						" sum(outsub.product_money) out_money, "+
						" 0 out_1002money "+
						" from "+
						" t_out_sub outsub "+
						" left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "+
						" LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = outsub.PRODUCT_ID    "+
						" where "+
						" 1 = 1 "+
						" and "+
						" outhead.warehouse_code like '"+currentWarehouseCode[0]+"%' "+
						" and  outhead.out_time >= '"+startType2+"' "+
						" and  outhead.out_time <= '"+endType2+"' "+
						" and  outsub.create_time >= '"+startType2+"' "+
					    " and  outsub.create_time <= '"+endType2+"' "
						+ " and pt.status=1 ";
						if(flag){
							monthstorage = monthstorage+" and outsub.balance_mode = '2' ";
						}else{
							if(balance_mode!=null&balance_mode.trim().length()>0){
								monthstorage += " and outsub.balance_mode = '"+balance_mode.trim()+"' ";
							}
							if(position!=null&position.trim().length()>0){
								monthstorage += " and outsub.position_code = '"+position.trim()+"' ";
							}
						}
						monthstorage = monthstorage+
						" group by "+
						" pt.product_type "+
						" union all "+
						  " select "
							+ " pt.product_type, "
							+ " sum(ms.product_count) init_count, "
							+ " sum(ms.product_money) init_money, "
							+ " 0 in_count, "
							+ " 0 in_money, "
							+ " 0 in_1002money, "
							+ " 0 out_count, "
							+ " 0 out_money, "
							+ " 0 out_2002money "
							+ " from "
							+ " t_month_storage ms "
							+ " LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = ms.PRODUCT_ID "
							+ " where " + " 1 = 1 " + " and "
							+ " ms.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' " + " and "
							+ " ms.month = '" + dataMonth + "' "
							+ " and pt.status=1 ";
					if (flag) {
						monthstorage = monthstorage
								+ " and  ms.balance_mode = '2' ";

					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							monthstorage += " and ms.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							monthstorage += " and ms.position_code = '"
									+ position.trim() + "' ";
						}
					}
					monthstorage = monthstorage
							+ " group by "
							+ " pt.product_type "+
						" ) a "+
						" group by product_type ";	
					}
					String instart = " select " + " a1.product_type, "
							+ " 0 init_count, "
							+ " 0 init_money, " + " a1.in_count, "
							+ " a1.in_money, " + " a1.in_1002money, "
							+ " 0 out_count, " + " 0 out_money, "
							+ " 0 out_2002money   " + " from( ";
		
					String inpart = " select "
							+ " pt.product_type, "
							+ " sum(insub.product_count) in_count, "
							+ " sum(insub.product_money) in_money, "
							+ " 0 in_1002money "
							+ " from "
							+ " t_in_sub insub "
							+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
							+ " LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = insub.PRODUCT_ID "
							+ " where " + " 1 = 1 " + " and "
							+ " inhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' " + " and "
							+ " inhead.in_time >= '" + start + "' " + " and "
							+ " inhead.in_time <= '" + end + "' "+ " and "
							+ " insub.create_time >= '" + start + "' " + " and "
							+ " insub.create_time <= '" + end + "' "
							+ " and pt.status=1 ";
					if (flag) {
						inpart += " and  insub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							inpart += " and insub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							inpart += " and insub.position_code = '"
									+ position.trim() + "' ";
						}
					}

					inpart = inpart
							+ " and "
							+ " inhead.in_type = '1001' and insub.status = '1'"
							+ " group by "
							+ " pt.product_type "
							+
							" union all "
							+
							" select "
							+ " pt.product_type, "
							+ " sum(insub.product_count) in_count,  0 in_money, "
							+ " sum(insub.product_money) in_1002money "
							+ " from "
							+ " t_in_sub insub "
							+ " left outer join t_in_head inhead on insub.in_bill_id = inhead.id "
							+ " LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = insub.PRODUCT_ID "
							+ " where " + " 1 = 1 " + " and "
							+ " inhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' " + " and "
							+ " inhead.in_time >= '" + start + "' " + " and "
							+ " inhead.in_time <= '" + end + "' "+ " and "
							+ " insub.create_time >= '" + start + "' " + " and "
							+ " insub.create_time <= '" + end + "' "
							+ " and pt.status=1 ";
					if (flag) {
						inpart = inpart + " and  insub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							inpart += " and insub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							inpart += " and insub.position_code = '"
									+ position.trim() + "' ";
						}
					}
					inpart = inpart
							+ " and "
							+ " inhead.in_type = '1002' and insub.status = '1'"
							+ " group by "
							+ " pt.product_type ";

					String inend = " ) a1 ";

					String outstart = " select " + " a2.product_type,  "
							+ " 0 init_count, "
							+ " 0 init_money, " + " 0 in_count, "
							+ " 0 in_money, " + " 0 in_1002money, "
							+ " a2.out_count, " + " a2.out_money, "
							+ " a2.out_1002money " + " from(  ";

					String outpart = " select "
							+ " pt.product_type, "
							+ " sum(outsub.product_count) out_count, "
							+ " sum(outsub.product_money) out_money, "
							+ " 0 out_1002money "
							+ " from "
							+ " t_out_sub outsub "
							+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
							+ " left outer join t_product_type pt ON pt.PRODUCT_ID = outsub.PRODUCT_ID    "
							+ " where " + " 1 = 1 "
							+ " and outhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ " and outhead.out_time >= '" + start + "' "
							+ " and outhead.out_time <= '" + end + "' "
							+ " and outsub.create_time >= '" + start + "' "
							+ " and outsub.create_time <= '" + end + "' "
							+ " and pt.status=1 ";
					if (flag) {
						outpart = outpart + " and outsub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							outpart += " and outsub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							outpart += " and outsub.position_code = '"
									+ position.trim() + "' ";
						}
					}
					outpart = outpart
							+ " and outhead.out_type = '2001' and outsub.status = '1'"
							+ " group by "
							+ " pt.product_type "
							+
							" union all "
							+
							" select "
							+ " pt.product_type, "
							+ " sum(outsub.product_count) out_count,  0 out_money, "
							+ " sum(out_money) out_1002money "
							+ " from "
							+ " t_out_sub outsub "
							+ " left outer join t_out_head outhead on outsub.out_bill_id = outhead.id "
							+ " LEFT OUTER JOIN t_product_type pt ON pt.PRODUCT_ID = outsub.PRODUCT_ID   "
							+ " where " + " 1 = 1 "
							+ " and outhead.warehouse_code like '"
							+ currentWarehouseCode[0] + "%' "
							+ " and outhead.out_time >= '" + start + "' "
							+ " and outhead.out_time <= '" + end + "' "
							+ " and outsub.create_time >= '" + start + "' "
							+ " and outsub.create_time <= '" + end + "' "
							+ " and pt.status=1 ";
					if (flag) {
						outpart = outpart + " and outsub.balance_mode = '2' ";
					} else {
						if (balance_mode != null
								& balance_mode.trim().length() > 0) {
							outpart += " and outsub.balance_mode = '"
									+ balance_mode.trim() + "' ";
						}
						if (position != null & position.trim().length() > 0) {
							outpart += " and outsub.position_code = '"
									+ position.trim() + "' ";
						}
					}
					outpart = outpart
							+ " and outhead.out_type = '2002' and outsub.status = '1'"
							+ " group by "
							+ " pt.product_type ";

					String outend = " ) a2 ";
					String masterend = " ) aa1  group by product_type order by product_type ";

					String all = null;
					all = masterstart + monthstorage + " union all " + instart
							+ inpart + inend + " union all " + outstart
							+ outpart + outend + masterend;
					List vec = new ArrayList();
					dbrs = DBEngine.doSelect(con, all);
					rs = dbrs.getRs();
					vec.add(currentWarehouseCode);
					while (rs.next()) {
						totalSize++;
						String[] values = new String[15];
						values[0] = rs.getString("product_type");
						values[1] = rs.getString("init_count");
						values[2] = rs.getString("init_money");
						values[3] = rs.getString("in_count");
						values[4] = rs.getString("in_money");
						values[5] = rs.getString("in_1002money");
						values[6] = rs.getString("in_moneys");
						values[7] = rs.getString("out_count");
						values[8] = rs.getString("out_money");
						values[9] = rs.getString("out_2002money");
						values[10] = rs.getString("out_moneys");
						values[11] = rs.getString("final_count");
						values[12] = rs.getString("final_money");
						vec.add(values);
					}
					fullList.add(vec);
				}
			} catch (Exception e2) {
				LogWriter.error(e2.getMessage());
				System.out.println(e2.getMessage());
			} finally {
				try {
					if (rs != null) {
						rs.close();
					}
					if (dbrs != null) {
						dbrs.clear();
					}
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (warehouesList == null) {
				isAvaliable = false;
			} else if (totalSize > 13000) {
				isAvaliable = false;
				isLager = true;
			} else {
				if (flag) {
					writeExcel_ReportProviderProductTypeAll(fullList, month,
							warehouseCode, fileName, start, end, request,
							response);
				} else {
					writeExcel_ReportProviderProductTypeAll(fullList, month,
							warehouseCode, fileName, start, end, request,
							response);
				}

			}
		}
		// 封装数据并返回给客户端
		// 判断报表生成的结果
		if (!isAvaliable) {
			if (isLager) {
				request.getSession().setAttribute("MSG",
						"数据量过于巨大，请缩小查询值的范围");
			} else {
				request.getSession()
						.setAttribute("MSG", "没有查到数据,请重新输入查询条件");
			}
			try {
				String path = "";
				if ("1".equals(title)) {
					path = "/system/report/ReportProductMS.jsp";
				} else if ("2".equals(title)) {
					path = "/system/report/ReportCustomer.jsp";
				} else if ("3".equals(title)) {
					path = "/system/report/ReportYKProductMonthNew.jsp";
				} else if ("4".equals(title)) {
					path = "/system/report/ReportYKMoneyMonth.jsp";
				} else if ("5".equals(title)) {
					path = "/system/report/ReportMDMoneyInout.jsp";
				} else if ("6".equals(title)) {
					path = "/system/report/ReportCustomerInList.jsp";
				} else if ("7".equals(title)) {
					path = "/system/report/ReportYKProductMonthList.jsp";
				} else if ("8".equals(title)) {
					path = "/system/report/ReportMDWCMoneyInout.jsp";
				} else if ("9".equals(title)) {
					path = "/system/report/ReportYKProductNew.jsp";
				} else if ("10".equals(title)) {
					path = "/system/report/ReportProductMS.jsp";
				} else if ("11".equals(title)) {
					path = "/system/report/ReportMDMoneyInoutNew.jsp";
				} else if ("12".equals(title)) {
					path = "/system/report/ReportYKProductMonthListNew.jsp";
				} else if ("13".equals(title)) {
					path = "/system/report/ReportCustomerMS.jsp";
				} else if ("14".equals(title)) {
					path = "/system/report/ReportAllWarehouseMoneyMonthSum.jsp";
				} else if ("16".equals(title)) {
					path = "/system/report/ReportAirProduct.jsp";
				} else if ("17".equals(title)) {
					path = "/system/report/ReportCustomerMS.jsp";
				} else if ("18".equals(title)) {
					path = "/system/report/ReportProduct.jsp";
				}else if ("19".equals(title)) {
					path = "/system/report/ReportProviderProductType.jsp";
				}else if ("20".equals(title)) {
					path = "/system/report/ReportProviderProductTypAll.jsp.jsp";
				}else if ("21".equals(title)) {
					path = "/system/report/ReportProductRepair.jsp";
				}else if ("22".equals(title)||"23".equals(title)) {
					path = "/system/report/ReportRepair.jsp";
				}
				
				getServletConfig().getServletContext()
						.getRequestDispatcher(path).forward(request,
								response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		session.setAttribute(IS_REPORT_PROCESSING, Boolean.FALSE);
	}

	private int getMaxDay(String start) {

			int startDay = 31; // 每月的默认天数
			try {
				startDay = DateUtil.getMaxDayOfMonth(Integer.parseInt(start.substring(0,4)), Integer.parseInt(start.substring(5,7)));
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		return startDay;
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
		doPost(request, response);
	}

	/**
	 * 报表2 领用报表
	 * 
	 * @param aList
	 * @param title
	 * @param start
	 * @param end
	 */
	private void writeExcel_ReportCustomer(String title, String fileName,
			ObjectList aList, ObjectList aListAll, String title1, String date,
			HttpServletRequest request, HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = tWb.createSheet();
			HSSFRow tRow = null;
			Region region = null;
			tSheet.setColumnWidth((short) 0, (short) (16 * 256));
			tSheet.setColumnWidth((short) 1, (short) (12 * 256));
			tSheet.setColumnWidth((short) 2, (short) (12 * 256));
			tSheet.setColumnWidth((short) 3, (short) (18 * 256));

			tWb.setSheetName(0, title, HSSFCell.ENCODING_UTF_16);

			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);

			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);

			// 标题行
			tRow = tSheet.createRow((short) 0);
			HSSFCell c0 = createCell(tWb, tRow, (short) 2, title1);
			c0.setCellStyle(cStyleM);
			// 日期行
			tRow = tSheet.createRow((short) 1);
			region = new Region(1, (short) 2, 1, (short) 3);
			tSheet.addMergedRegion(region);
			createCell(tWb, tRow, (short) 2, date, HSSFCellStyle.ALIGN_CENTER,
					false);

			// 表头行
			tRow = tSheet.createRow((short) 2);

			HSSFCell c1 = createCell(tWb, tRow, (short) 0, "序号");
			HSSFCell c2 = createCell(tWb, tRow, (short) 1, "领料单位编码");
			HSSFCell c3 = createCell(tWb, tRow, (short) 2, "领料单位名称");
			HSSFCell c4 = createCell(tWb, tRow, (short) 3, "总金额");
			c1.setCellStyle(cStyleM_R);
			c2.setCellStyle(cStyleM_R);
			c3.setCellStyle(cStyleM_R);
			c4.setCellStyle(cStyleM_R);
			double totalMoney = 0;
			short index = 2; // 当前所在行号
			double customerMoney = 0;
			int num = 0;
			String customerName = "";
			String customerCode = "";

			for (int i = 0; i < aList.size(); i++) {
				UniversalRow row = (UniversalRow) aList.get(i);
				// -----------------------
				// 统计领料单位出库总金额
				customerMoney = 0;
				for (int j = 0; j < aListAll.size(); j++) {
					UniversalRow rowAll = (UniversalRow) aListAll.get(j);
					if (rowAll.getString("CODE").equals(row.getString("CC"))) {
						customerMoney += Double.parseDouble(rowAll
								.getString("MONEY"));
						customerName = rowAll.getString("NAME");
						customerCode = rowAll.getString("CODE");
					}

				}
				totalMoney += customerMoney;
				// -----------------------

				tRow = tSheet.createRow((short) (index + 1));

				createCell(tWb, tRow, (short) 0, String.valueOf(++num));
				createCell(tWb, tRow, (short) 1, customerCode);
				createCell(tWb, tRow, (short) 2, customerName);
				createCell(tWb, tRow, (short) 3, StringUtil.showPrice(String
						.valueOf(customerMoney)));

				index++;

				row = null;
			}
			if (index > 2) {
				// 創建最後一個統計行
				tRow = tSheet.createRow((short) (index + 1));
				HSSFCell sp1 = tRow.createCell((short) 0);
				HSSFCell sp2 = tRow.createCell((short) 1);
				HSSFCell cell_1 = tRow.createCell((short) 2);
				HSSFCell cell_2 = tRow.createCell((short) 3);

				sp1.setCellStyle(cStyleM_R);
				sp2.setCellStyle(cStyleM_R);
				cell_1.setCellStyle(cStyleM_R);
				cell_2.setCellStyle(cStyleM_R);

				// HSSFCell tongjiCell = tRow.createCell((short)1);
				cell_1.setEncoding(HSSFCell.ENCODING_UTF_16);
				String viewValue = StringUtil.showPrice(String
						.valueOf(totalMoney));

				cell_1.setCellValue("合计:");
				cell_2.setCellValue(viewValue);
			}

			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 报表3 压库产品进销存资金汇总月报
	 * 
	 * @param aList
	 * @param title
	 * @param start
	 * @param end
	 */
	private void writeExcel_ReportYKProductMonth(Vector vec,
			String warehouseCode, String month, String title, String fileName,
			String title1, String date, HttpServletRequest request,
			HttpServletResponse response, String start, String end) {
		ServletOutputStream out = null;
		try {
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = tWb.createSheet();
			HSSFRow tRow = null;
			Region region = null;
			tSheet.setColumnWidth((short) 0, (short) (16 * 256));
			tSheet.setColumnWidth((short) 1, (short) (12 * 256));
			tSheet.setColumnWidth((short) 2, (short) (12 * 256));
			tSheet.setColumnWidth((short) 3, (short) (18 * 256));
			tSheet.setColumnWidth((short) 4, (short) (10 * 256));

			tWb.setSheetName(0, title, HSSFCell.ENCODING_UTF_16);

			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);

			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);

			// 标题行
			tRow = tSheet.createRow((short) 0);
			HSSFCell c0 = createCell(tWb, tRow, (short) 2, title1);
			c0.setCellStyle(cStyleM);
			// 日期行
			tRow = tSheet.createRow((short) 1);
			region = new Region(1, (short) 3, 1, (short) 4);
			tSheet.addMergedRegion(region);
			createCell(tWb, tRow, (short) 3, date, HSSFCellStyle.ALIGN_CENTER,
					false);

			// 表头行
			tRow = tSheet.createRow((short) 2);

			HSSFCell c1 = createCell(tWb, tRow, (short) 0, "产品类别");
			HSSFCell c2 = createCell(tWb, tRow, (short) 1, "期初金额");
			HSSFCell c3 = createCell(tWb, tRow, (short) 2, "入库金额");
			HSSFCell c4 = createCell(tWb, tRow, (short) 3, "出库金额");
			HSSFCell c5 = createCell(tWb, tRow, (short) 4, "期末金额");

			c1.setCellStyle(cStyleM_R);
			c2.setCellStyle(cStyleM_R);
			c3.setCellStyle(cStyleM_R);
			c4.setCellStyle(cStyleM_R);
			c5.setCellStyle(cStyleM_R);
			short index = 2; // 当前所在行号
			DBConnection con = null;
			con = DBConnection.open(false);
			double totalMonth = 0;
			double totalIn = 0;
			double totalOut = 0;
			double totalFinal = 0;
			for (int i = 0; i < vec.size(); i++) {
				String[] values = (String[]) vec.get(i);
				// 創建一行
				tRow = tSheet.createRow((short) (index + 1));
				String cateName = null;
				if (values[0].equals("000000")) {
					cateName = "未分类";
				} else {
					ProductCategory pc = ProductCategory.fetchByCode(con,
							values[0]);
					if (pc != null) {
						cateName = pc.getName();
					}
				}
				String monthStorageMoneyTemp = values[2];
				String inMoneyTemp = values[4];
				String outMoneyTemp = values[6];
				String finalMoneyTemp = values[8];
				createCell(tWb, tRow, (short) 0, cateName);
				createCell(tWb, tRow, (short) 1, StringUtil
						.showPrice(monthStorageMoneyTemp));
				createCell(tWb, tRow, (short) 2, StringUtil
						.showPrice(inMoneyTemp));
				createCell(tWb, tRow, (short) 3, StringUtil
						.showPrice(outMoneyTemp));
				createCell(tWb, tRow, (short) 4, StringUtil
						.showPrice(finalMoneyTemp));
				index++;
				totalMonth += Double.parseDouble(monthStorageMoneyTemp);
				totalIn += Double.parseDouble(inMoneyTemp);
				totalOut += Double.parseDouble(outMoneyTemp);
				totalFinal += Double.parseDouble(finalMoneyTemp);
			}
			// 总计行
			if (index > 2) {
				tRow = tSheet.createRow((short) (index + 2));
				HSSFCell zongjiCell = tRow.createCell((short) 0);
				HSSFCell cell_1 = tRow.createCell((short) 1);
				HSSFCell cell_2 = tRow.createCell((short) 2);
				HSSFCell cell_3 = tRow.createCell((short) 3);
				HSSFCell cell_4 = tRow.createCell((short) 4);
				zongjiCell.setCellStyle(cStyleM_R);
				cell_1.setCellStyle(cStyleM_R);
				cell_2.setCellStyle(cStyleM_R);
				cell_3.setCellStyle(cStyleM_R);
				cell_4.setCellStyle(cStyleM_R);
				zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
				zongjiCell.setCellValue("合计：");
				cell_1.setCellValue(StringUtil.showPrice(String
						.valueOf(totalMonth)));
				cell_2.setCellValue(StringUtil.showPrice(String
						.valueOf(totalIn)));
				cell_3.setCellValue(StringUtil.showPrice(String
						.valueOf(totalOut)));
				cell_4.setCellValue(StringUtil.showPrice(String
						.valueOf(totalFinal)));
			}
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 报表4 压库产品应付款月报
	 * 
	 * @param aList
	 * @param title
	 * @param start
	 * @param end
	 */
	private void writeExcel_ReportYKMoneyMonth(String title, String fileName,
			ObjectList aList, ObjectList aListTrue, ObjectList aListFalse,
			String title1, String date, HttpServletRequest request,
			HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = tWb.createSheet();
			HSSFRow tRow = null;
			Region region = null;
			tSheet.setColumnWidth((short) 0, (short) (16 * 256));
			tSheet.setColumnWidth((short) 1, (short) (12 * 256));
			tSheet.setColumnWidth((short) 2, (short) (12 * 256));

			tWb.setSheetName(0, title1, HSSFCell.ENCODING_UTF_16);

			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);

			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);

			// 标题行
			tRow = tSheet.createRow((short) 0);
			HSSFCell c0 = createCell(tWb, tRow, (short) 1, title1);
			c0.setCellStyle(cStyleM);
			// 日期行
			tRow = tSheet.createRow((short) 1);
			region = new Region(1, (short) 1, 1, (short) 2);
			tSheet.addMergedRegion(region);
			createCell(tWb, tRow, (short) 1, date, HSSFCellStyle.ALIGN_CENTER,
					false);

			// 表头行
			tRow = tSheet.createRow((short) 2);

			HSSFCell c1 = createCell(tWb, tRow, (short) 0, "供应商编码");
			HSSFCell c2 = createCell(tWb, tRow, (short) 1, "供应商名称");
			HSSFCell c3 = createCell(tWb, tRow, (short) 2, "网下出库金额");
			HSSFCell c4 = createCell(tWb, tRow, (short) 3, "网上出库金额");

			c1.setCellStyle(cStyleM_R);
			c2.setCellStyle(cStyleM_R);
			c3.setCellStyle(cStyleM_R);
			c4.setCellStyle(cStyleM_R);
			short index = 2; // 当前所在行号
			double trueMoney = 0;
			double falseMoney = 0;
			double totalTrueMoney = 0;
			double totalFalseMoney = 0;

			String providerName = "";
			String providerCode = "";
			for (int i = 0; i < aList.size(); i++) {

				// -----------------------
				// 统计产品出入库总数及总价

				UniversalRow row = (UniversalRow) aList.get(i);

				// DBConnection con = null;
				// con = DBConnection.open(false);
				// Provider pv = Provider.fetchByCode(con,
				// row.getString("PROVIDER_CODE"));
				if (aListTrue != null) {
					for (int j = 0; j < aListTrue.size(); j++) {
						UniversalRow rowTrue = (UniversalRow) aListTrue.get(j);
						if (rowTrue.getString("CODE").equals(
								row.getString("PROVIDER_CODE"))) {
							trueMoney += Double.parseDouble(rowTrue
									.getString("MONEY"));
							providerName = rowTrue.getString("NAME");
							providerCode = rowTrue.getString("CODE");
						}
					}
				} else {
					trueMoney = 0;
					// providerName = pv.getName();
				}

				if (aListFalse != null) {
					for (int k = 0; k < aListFalse.size(); k++) {
						UniversalRow rowFalse = (UniversalRow) aListFalse
								.get(k);
						if (rowFalse.getString("CODE").equals(
								row.getString("PROVIDER_CODE"))) {
							falseMoney += Double.parseDouble(rowFalse
									.getString("MONEY"));
							providerName = rowFalse.getString("NAME");
							providerCode = rowFalse.getString("CODE");
						}
					}
				} else {
					falseMoney = 0;
					// con.close();
					// -----------------------
				}

				// 創建一行
				tRow = tSheet.createRow((short) (index + 1));
				createCell(tWb, tRow, (short) 0, providerCode);
				createCell(tWb, tRow, (short) 1, providerName);
				createCell(tWb, tRow, (short) 2, StringUtil.showPrice(String
						.valueOf(trueMoney)));
				createCell(tWb, tRow, (short) 3, StringUtil.showPrice(String
						.valueOf(falseMoney)));

				index++;

				totalTrueMoney += trueMoney;
				totalFalseMoney += falseMoney;
				providerName = "";
				providerCode = "";
				trueMoney = 0;
				falseMoney = 0;
			}

			// 总计行
			if (index > 2) {
				tRow = tSheet.createRow((short) (index + 2));
				HSSFCell zongjiCell = tRow.createCell((short) 0);
				HSSFCell cell_1 = tRow.createCell((short) 1);
				HSSFCell cell_2 = tRow.createCell((short) 2);
				HSSFCell cell_3 = tRow.createCell((short) 3);

				zongjiCell.setCellStyle(cStyleM_R);
				cell_1.setCellStyle(cStyleM_R);
				cell_2.setCellStyle(cStyleM_R);

				zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
				zongjiCell.setCellValue("合计:");
				cell_1.setCellValue("");
				cell_2.setCellValue(StringUtil.showPrice(String
						.valueOf(totalTrueMoney)));
				cell_3.setCellValue(StringUtil.showPrice(String
						.valueOf(totalFalseMoney)));
				// region = new Region(index+2,(short)0,index+2,(short)3);
				// tSheet.addMergedRegion(region);

			}

			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 报表5 买断产品资金进出累计汇总（成本价）
	 * 
	 * @param aList
	 * @param title
	 * @param start
	 * @param end
	 */
	private void writeExcel_ReportMDMoneyInout(Vector vec, String month,
			String warehouseCode, String title, String fileName, String title1,
			String start, String end, HttpServletRequest request,
			HttpServletResponse response) {
		DBConnection con = null;
		ServletOutputStream out = null;
		try {
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = tWb.createSheet();
			HSSFRow tRow = null;
			Region region = null;
			tSheet.setColumnWidth((short) 0, (short) (16 * 256));
			tSheet.setColumnWidth((short) 1, (short) (12 * 256));
			tSheet.setColumnWidth((short) 2, (short) (12 * 256));
			tSheet.setColumnWidth((short) 3, (short) (18 * 256));
			tSheet.setColumnWidth((short) 4, (short) (10 * 256));
			tSheet.setColumnWidth((short) 5, (short) (10 * 256));
			tSheet.setColumnWidth((short) 6, (short) (10 * 256));
			tSheet.setColumnWidth((short) 7, (short) (10 * 256));
			tSheet.setColumnWidth((short) 8, (short) (12 * 256));
			tSheet.setColumnWidth((short) 9, (short) (14 * 256));
			tSheet.setColumnWidth((short) 10, (short) (14 * 256));
			tSheet.setColumnWidth((short) 11, (short) (14 * 256));
			tSheet.setColumnWidth((short) 12, (short) (14 * 256));
			tSheet.setColumnWidth((short) 13, (short) (14 * 256));

			tWb.setSheetName(0, title1, HSSFCell.ENCODING_UTF_16);

			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);

			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);

			// 标题行
			tRow = tSheet.createRow((short) 0);
			HSSFCell c0 = createCell(tWb, tRow, (short) 4, title1);
			c0.setCellStyle(cStyleM);
			// 日期行
			tRow = tSheet.createRow((short) 1);
			region = new Region(1, (short) 4, 1, (short) 8);
			tSheet.addMergedRegion(region);
			createCell(tWb, tRow, (short) 4, "统计日期:" + start + " 至 " + end,
					HSSFCellStyle.ALIGN_CENTER, false);

			// 表头行
			tRow = tSheet.createRow((short) 2);

			HSSFCell c1 = createCell(tWb, tRow, (short) 0, "产品类别");
			HSSFCell c2 = createCell(tWb, tRow, (short) 1, "期初金额");
			HSSFCell c3 = createCell(tWb, tRow, (short) 2, "购入");
			HSSFCell c4 = createCell(tWb, tRow, (short) 3, "盘盈");
			HSSFCell c5 = createCell(tWb, tRow, (short) 4, "入库合计");
			HSSFCell c6 = createCell(tWb, tRow, (short) 5, "领用");
			HSSFCell c7 = createCell(tWb, tRow, (short) 6, "盘亏");
			HSSFCell c8 = createCell(tWb, tRow, (short) 7, "出库合计");
			HSSFCell c9 = createCell(tWb, tRow, (short) 8, "结存");

			c1.setCellStyle(cStyleM_R);
			c2.setCellStyle(cStyleM_R);
			c3.setCellStyle(cStyleM_R);
			c4.setCellStyle(cStyleM_R);
			c5.setCellStyle(cStyleM_R);
			c6.setCellStyle(cStyleM_R);
			c7.setCellStyle(cStyleM_R);
			c8.setCellStyle(cStyleM_R);
			c9.setCellStyle(cStyleM_R);

			short index = 2; // 当前所在行号

			double productInMoney1 = 0;
			double productInMoney2 = 0;
			double productInMoney3 = 0;
			double productOutMoney1 = 0;
			double productOutMoney2 = 0;
			double productOutMoney3 = 0;
			double allMoney = 0;

			// 期初数据

			double monthMoney = 0;

			// 合计行信息
			double totalMonthMoney = 0;
			double totalInMoney1 = 0;
			double totalInMoney2 = 0;
			double totalAllInMoney = 0;
			double totalOutMoney1 = 0;
			double totalOutMoney2 = 0;
			double totalAllOutMoney = 0;
			double totalMoney = 0;

			con = DBConnection.open(false);
			WarehouseCategory whc = new WarehouseCategory();
			String cateName = "";
			for (int i = 0; i < vec.size(); i++) {
				String[] values = (String[]) vec.get(i);
				monthMoney = Double.parseDouble(values[2]);
				productInMoney1 = Double.parseDouble(values[4]);
				productInMoney2 = Double.parseDouble(values[5]);
				productInMoney3 = Double.parseDouble(values[6]);
				productOutMoney1 = Double.parseDouble(values[8]);
				productOutMoney2 = Double.parseDouble(values[9]);
				productOutMoney3 = Double.parseDouble(values[10]);
				allMoney = Double.parseDouble(values[12]);
				if (values[0].equals("000000")) {
					cateName = "未分类";
				} else {
					ProductCategory pc = ProductCategory.fetchByCode(con,
							values[0]);
					if (pc != null) {
						cateName = pc.getName();
					}
				}
				tRow = tSheet.createRow((short) (index + 1));
				createCell(tWb, tRow, (short) 0, cateName);
				createCell(tWb, tRow, (short) 1, StringUtil.showPrice(String
						.valueOf(monthMoney)));
				createCell(tWb, tRow, (short) 2, StringUtil.showPrice(String
						.valueOf(productInMoney1)));
				createCell(tWb, tRow, (short) 3, StringUtil.showPrice(String
						.valueOf(productInMoney2)));
				createCell(tWb, tRow, (short) 4, StringUtil.showPrice(String
						.valueOf(productInMoney3)));
				createCell(tWb, tRow, (short) 5, StringUtil.showPrice(String
						.valueOf(productOutMoney1)));
				createCell(tWb, tRow, (short) 6, StringUtil.showPrice(String
						.valueOf(productOutMoney2)));
				createCell(tWb, tRow, (short) 7, StringUtil.showPrice(String
						.valueOf(productOutMoney3)));
				createCell(tWb, tRow, (short) 8, StringUtil.showPrice(String
						.valueOf(allMoney)));

				totalMonthMoney += monthMoney;
				totalInMoney1 += productInMoney1;
				totalInMoney2 += productInMoney2;
				totalAllInMoney += productInMoney3;
				totalOutMoney1 += productOutMoney1;
				totalOutMoney2 += productOutMoney2;
				totalAllOutMoney += productOutMoney3;
				totalMoney += allMoney;

				productInMoney1 = 0;
				productInMoney2 = 0;
				productOutMoney1 = 0;
				productOutMoney2 = 0;
				allMoney = 0;
				monthMoney = 0;
				allMoney = 0;
				index++;
			}
			index++;

			// 总计行
			if (index > 2) {
				tRow = tSheet.createRow((short) (index + 2));
				HSSFCell zongjiCell = tRow.createCell((short) 0);
				HSSFCell cell_1 = tRow.createCell((short) 1);
				HSSFCell cell_2 = tRow.createCell((short) 2);
				HSSFCell cell_3 = tRow.createCell((short) 3);
				HSSFCell cell_4 = tRow.createCell((short) 4);
				HSSFCell cell_5 = tRow.createCell((short) 5);
				HSSFCell cell_6 = tRow.createCell((short) 6);
				HSSFCell cell_7 = tRow.createCell((short) 7);
				HSSFCell cell_8 = tRow.createCell((short) 8);

				zongjiCell.setCellStyle(cStyleM_R);
				cell_1.setCellStyle(cStyleM_R);
				cell_2.setCellStyle(cStyleM_R);
				cell_3.setCellStyle(cStyleM_R);
				cell_4.setCellStyle(cStyleM_R);
				cell_5.setCellStyle(cStyleM_R);
				cell_6.setCellStyle(cStyleM_R);
				cell_7.setCellStyle(cStyleM_R);
				cell_8.setCellStyle(cStyleM_R);

				zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);

				zongjiCell.setCellValue("合计：");
				cell_1.setCellValue(StringUtil.showPrice(String
						.valueOf(totalMonthMoney)));
				cell_2.setCellValue(StringUtil.showPrice(String
						.valueOf(totalInMoney1)));
				cell_3.setCellValue(StringUtil.showPrice(String
						.valueOf(totalInMoney2)));
				cell_4.setCellValue(StringUtil.showPrice(String
						.valueOf(totalAllInMoney)));
				cell_5.setCellValue(StringUtil.showPrice(String
						.valueOf(totalOutMoney1)));
				cell_6.setCellValue(StringUtil.showPrice(String
						.valueOf(totalOutMoney2)));
				cell_7.setCellValue(StringUtil.showPrice(String
						.valueOf(totalAllOutMoney)));
				cell_8.setCellValue(StringUtil.showPrice(String
						.valueOf(totalMoney)));

			}

			fileName = fileName + ".xls";
			response.setHeader("Cache-Control", "No-cache");
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
			response.setDateHeader("Expires", 0);
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();

			tWb.write(out);

			out.flush();
			out.close();

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception ex1) {

			}
		}
	}

	/**
	 * 报表6 合并库收料清单（修理公司）
	 * 
	 * @param aList
	 * @param title
	 * @param start
	 * @param end
	 */
	private void writeExcel_ReportCustomerInList(String warehouseCode,
			String inCustomerName, String getCustomers, String title,
			String fileName, ObjectList aList, ObjectList aListAll,
			String title1, String start, String end,
			HttpServletRequest request, HttpServletResponse response) {
		DBConnection con = null;
		ServletOutputStream out = null;
		try {
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = tWb.createSheet();
			HSSFRow tRow = null;
			Region region = null;
			tSheet.setColumnWidth((short) 0, (short) (16 * 256));
			tSheet.setColumnWidth((short) 1, (short) (12 * 256));
			tSheet.setColumnWidth((short) 2, (short) (12 * 256));
			tSheet.setColumnWidth((short) 3, (short) (18 * 256));

			tWb.setSheetName(0, title1, HSSFCell.ENCODING_UTF_16);

			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);

			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);

			// 标题行
			tRow = tSheet.createRow((short) 0);
			HSSFCell c0 = createCell(tWb, tRow, (short) 3, title1);
			c0.setCellStyle(cStyleM);
			// 日期行
			tRow = tSheet.createRow((short) 1);
			region = new Region(1, (short) 2, 1, (short) 7);
			tSheet.addMergedRegion(region);
			createCell(tWb, tRow, (short) 2, "供货单位:" + inCustomerName + "     "
					+ start + " 至 " + end, HSSFCellStyle.ALIGN_LEFT, false);

			// 表头行
			tRow = tSheet.createRow((short) 2);

			HSSFCell c1 = createCell(tWb, tRow, (short) 0, "网上编码");
			HSSFCell c2 = createCell(tWb, tRow, (short) 1, "材料自编号");
			HSSFCell c3 = createCell(tWb, tRow, (short) 2, "材料名称");
			HSSFCell c4 = createCell(tWb, tRow, (short) 3, "规格");
			HSSFCell c5 = createCell(tWb, tRow, (short) 4, "帐本号");
			HSSFCell c6 = createCell(tWb, tRow, (short) 5, "单价");
			HSSFCell c7 = createCell(tWb, tRow, (short) 6, "入库数量");
			HSSFCell c8 = createCell(tWb, tRow, (short) 7, "入库金额");
			c1.setCellStyle(cStyleM_R);
			c2.setCellStyle(cStyleM_R);
			c3.setCellStyle(cStyleM_R);
			c4.setCellStyle(cStyleM_R);
			c5.setCellStyle(cStyleM_R);
			c6.setCellStyle(cStyleM_R);
			c7.setCellStyle(cStyleM_R);
			c8.setCellStyle(cStyleM_R);

			// String[] tTemp;
			double totalMoney = 0;
			double totalPrice = 0;
			double totalCount = 0;

			int regionBegin = 0;
			int regionEnd = 0;
			// String currentDept = "";
			short index = 2; // 当前所在行号
			BigDecimal zongji = new BigDecimal("0");
			double money = 0;
			double price = 0;
			double count = 0;

			String concentricityCode = "";
			String apepCode = "";
			String name = "";
			String spec = "";
			String warehouseCategory = "";

			con = DBConnection.open(false);

			for (int i = 0; i < aList.size(); i++) {
				UniversalRow row = (UniversalRow) aList.get(i);
				// -----------------------
				// 统计领料单位出库总金额
				for (int j = 0; j < aListAll.size(); j++) {
					UniversalRow rowAll = (UniversalRow) aListAll.get(j);
					if (rowAll.getString("CONCENTRICITY_CODE").equals(
							row.getString("CODE"))) {
						money += Double.parseDouble(rowAll.getString("MONEY"));
						price += Double.parseDouble(rowAll.getString("PRICE"));
						count += Double.parseDouble(rowAll.getString("COUNT"));

						concentricityCode = rowAll
								.getString("CONCENTRICITY_CODE");
						apepCode = rowAll.getString("APEP_CODE");
						name = rowAll.getString("NAME");
						spec = rowAll.getString("SPEC");
					}

				}

				totalMoney += money;
				totalPrice += price;
				totalCount += count;

				// -----------------------
				WarehouseCategoryRelation wcr = WarehouseCategoryRelation
						.fetchbyProductWarehouseCode(con, concentricityCode,
								warehouseCode);
				if (wcr == null) {
					warehouseCategory = "";
				} else {
					warehouseCategory = wcr.getCategoryCode();
				}

				tRow = tSheet.createRow((short) (index + 1));

				createCell(tWb, tRow, (short) 0, concentricityCode);
				createCell(tWb, tRow, (short) 1, apepCode);
				createCell(tWb, tRow, (short) 2, name);
				createCell(tWb, tRow, (short) 3, spec);
				createCell(tWb, tRow, (short) 4, warehouseCategory);
				createCell(tWb, tRow, (short) 5, StringUtil.showPrice(price, 4));
				createCell(tWb, tRow, (short) 6, StringUtil.showCount(String
						.valueOf(count)));
				createCell(tWb, tRow, (short) 7, StringUtil.showPrice(String
						.valueOf(money)));

				index++;

				money = 0;
				price = 0;
				count = 0;
				concentricityCode = "";
				apepCode = "";
				name = "";
				spec = "";

				row = null;
			}
			if (index > 2) {
				// 創建最後一個統計行
				tRow = tSheet.createRow((short) (index + 1));
				HSSFCell tongjiCell = tRow.createCell((short) 1);
				HSSFCell cell_1 = tRow.createCell((short) 5);
				HSSFCell cell_2 = tRow.createCell((short) 6);
				HSSFCell cell_3 = tRow.createCell((short) 7);

				tongjiCell.setCellStyle(cStyleM_R);
				cell_1.setCellStyle(cStyleM_R);
				cell_2.setCellStyle(cStyleM_R);
				cell_3.setCellStyle(cStyleM_R);

				// HSSFCell tongjiCell = tRow.createCell((short)1);
				tongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);

				tongjiCell.setCellValue("合计:");
				cell_1.setCellValue(StringUtil.showPrice(totalPrice, 4));
				cell_2.setCellValue(StringUtil.showCount(String
						.valueOf(totalCount)));
				cell_3.setCellValue(StringUtil.showPrice(String
						.valueOf(totalMoney)));
			}

			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);

		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception ex1) {

			}
		}
	}

	private HSSFCell createCell(HSSFWorkbook aWb, HSSFRow aRow, short column,
			String alaValueue) {
		HSSFCell tCell = aRow.createCell(column);
		tCell.setEncoding(HSSFCell.ENCODING_UTF_16);
		tCell.setCellValue(alaValueue);
		return tCell;
	}

	private HSSFCell createCell(HSSFWorkbook aWb, HSSFRow aRow, short column,
			String aValue, short aAlign, boolean border) {
		HSSFCell tCell = aRow.createCell(column);
		tCell.setEncoding(HSSFCell.ENCODING_UTF_16);
		tCell.setCellValue(aValue);
		HSSFCellStyle tCellStyle = aWb.createCellStyle();
		tCellStyle.setAlignment(aAlign);
		tCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		if (border) {
			tCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			tCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			tCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			tCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			tCellStyle.setBottomBorderColor(HSSFColor.BLACK.index);
			tCellStyle.setTopBorderColor(HSSFColor.BLACK.index);
			tCellStyle.setRightBorderColor(HSSFColor.BLACK.index);
			tCellStyle.setLeftBorderColor(HSSFColor.BLACK.index);
		}
		tCell.setCellStyle(tCellStyle);
		return tCell;
	}

	private HSSFCell createCell(HSSFWorkbook aWb, HSSFRow aRow, short column,
			String aValue, short aAlign, short bAlign) {
		HSSFCell tCell = aRow.createCell(column);
		tCell.setEncoding(HSSFCell.ENCODING_UTF_16);
		tCell.setCellValue(aValue);
		HSSFCellStyle tCellStyle = aWb.createCellStyle();
		tCellStyle.setAlignment(aAlign);
		tCellStyle.setVerticalAlignment(bAlign);

		tCell.setCellStyle(tCellStyle);
		return tCell;
	}

	/** EXCEL 处理 报表① */
	private void writeExcel_ReportYKProduct(String month, String title,
			String fileName, Vector vec, String title1, String start,
			String end, String warehouseCode, HttpServletRequest request,
			HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			/** 创建通用EXCEL 开始 */
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = null;
			HSSFRow tRow = null;
			Region region = null;
			HSSFCell c0 = null;
			HSSFCell c1 = null;
			HSSFCell c2 = null;
			HSSFCell c3 = null;
			HSSFCell c4 = null;
			HSSFCell c5 = null;
			HSSFCell c6 = null;
			HSSFCell c7 = null;
			HSSFCell c8 = null;
			HSSFCell c9 = null;
			HSSFCell c10 = null;
			HSSFCell c11 = null;
			HSSFCell c12 = null;
			HSSFCell c13 = null;
			HSSFCell c14 = null;
			HSSFCell c15 = null;
			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);
			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);
			/** 创建通用EXCEL 结束 */

			/** 创建Sheet 开始 */
			for (int k = 0; k < vec.size(); k++) {
				Vector vec1 = (Vector) vec.get(k);
				short index = 2; // 当前所在行号
				double totalMonthStorageMoney = 0;
				double totalMonthStorageCount = 0;
				double totalInCount = 0;
				double totalInMoney = 0;
				double totalOutCount = 0;
				double totalOutMoney = 0;
				double totalMonthEndCount = 0;
				double totalMonthEndMoney = 0;
				String productCode = "";
				String productName = "";
				String spec = "";
				String model = "";
				String brand = "";
				String unit = "";
				String productApepCode = "";
				// 创建 sheet
				tSheet = tWb.createSheet();
				ProviderTemp pt = (ProviderTemp) vec1.get(0);
				tWb.setSheetName(k, pt.ProviderName + pt.providerCode,
						HSSFCell.ENCODING_UTF_16);
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				tSheet.setColumnWidth((short) 5, (short) (10 * 256));
				tSheet.setColumnWidth((short) 6, (short) (10 * 256));
				tSheet.setColumnWidth((short) 7, (short) (10 * 256));
				tSheet.setColumnWidth((short) 8, (short) (10 * 256));
				tSheet.setColumnWidth((short) 9, (short) (12 * 256));
				tSheet.setColumnWidth((short) 10, (short) (14 * 256));
				tSheet.setColumnWidth((short) 11, (short) (14 * 256));
				tSheet.setColumnWidth((short) 12, (short) (14 * 256));
				tSheet.setColumnWidth((short) 13, (short) (14 * 256));
				tSheet.setColumnWidth((short) 14, (short) (14 * 256));
				tSheet.setColumnWidth((short) 15, (short) (14 * 256));
				// 标题行
				tRow = tSheet.createRow((short) 0);
				c0 = createCell(tWb, tRow, (short) 5, title1);
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 9, 1, (short) 13);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 9, "供应商:" + pt.ProviderName
						+ "     " + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
				// 表头行
				tRow = tSheet.createRow((short) 2);
				c1 = createCell(tWb, tRow, (short) 0, "产品编码");
				c2 = createCell(tWb, tRow, (short) 1, "自编码");
				c3 = createCell(tWb, tRow, (short) 2, "产品名称");
				c4 = createCell(tWb, tRow, (short) 3, "规格");
				c5 = createCell(tWb, tRow, (short) 4, "型号");
				c6 = createCell(tWb, tRow, (short) 5, "品牌");
				c7 = createCell(tWb, tRow, (short) 6, "单位");
				c8 = createCell(tWb, tRow, (short) 7, "单价");
				c9 = createCell(tWb, tRow, (short) 8, "期初数量");
				c10 = createCell(tWb, tRow, (short) 9, "期初金额");
				c11 = createCell(tWb, tRow, (short) 10, "入库数量");
				c12 = createCell(tWb, tRow, (short) 11, "入库金额");
				c13 = createCell(tWb, tRow, (short) 12, "领出数量");
				c14 = createCell(tWb, tRow, (short) 13, "领出金额");
				c15 = createCell(tWb, tRow, (short) 14, "期末数量");
				c0 = createCell(tWb, tRow, (short) 15, "期末金额");
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				c10.setCellStyle(cStyleM_R);
				c11.setCellStyle(cStyleM_R);
				c12.setCellStyle(cStyleM_R);
				c13.setCellStyle(cStyleM_R);
				c14.setCellStyle(cStyleM_R);
				c15.setCellStyle(cStyleM_R);
				c0.setCellStyle(cStyleM_R);
				// 期初计算
				for (int i = 1; i < vec1.size(); i++) {
					String[] values = (String[]) vec1.get(i);
					double productMonthMoney = 0;
					double productMonthCount = 0;
					double productInCount = 0;
					double productInMoney = 0;
					double productOutCount = 0;
					double productOutMoney = 0;
					double monthEndCount = 0;
					double monthEndMoney = 0;
					productMonthCount = Double.parseDouble(values[1]);
					productMonthMoney = Double.parseDouble(values[2]);

					productInCount = Double.parseDouble(values[3]);
					productInMoney = Double.parseDouble(values[4]);

					productOutCount = Double.parseDouble(values[5]);
					productOutMoney = Double.parseDouble(values[6]);

					monthEndCount = Double.parseDouble(values[7]);
					monthEndMoney = Double.parseDouble(values[8]);
					// 創建一行
					tRow = tSheet.createRow((short) (index + 1));
					createCell(tWb, tRow, (short) 0, values[0]);
					createCell(tWb, tRow, (short) 1, values[9] == null ? ""
							: values[9]);
					createCell(tWb, tRow, (short) 2, values[10] == null ? ""
							: values[10]);
					createCell(tWb, tRow, (short) 3, values[11] == null ? ""
							: values[11]);
					createCell(tWb, tRow, (short) 4, values[12] == null ? ""
							: values[12]);
					createCell(tWb, tRow, (short) 5, values[13] == null ? ""
							: values[13]);
					createCell(tWb, tRow, (short) 6, values[14] == null ? ""
							: values[14]);
					createCell(tWb, tRow, (short) 7, StringUtil
							.showCount(values[15]));
					createCell(tWb, tRow, (short) 8, StringUtil
							.showCount(String.valueOf(productMonthCount)));
					createCell(tWb, tRow, (short) 9, StringUtil
							.showPrice(String.valueOf(productMonthMoney)));
					createCell(tWb, tRow, (short) 10, StringUtil
							.showCount(String.valueOf(productInCount)));
					createCell(tWb, tRow, (short) 11, StringUtil
							.showPrice(String.valueOf(productInMoney)));
					createCell(tWb, tRow, (short) 12, StringUtil
							.showCount(String.valueOf(productOutCount)));
					createCell(tWb, tRow, (short) 13, StringUtil
							.showPrice(String.valueOf(productOutMoney)));
					createCell(tWb, tRow, (short) 14, StringUtil
							.showCount(String.valueOf(monthEndCount)));
					createCell(tWb, tRow, (short) 15, StringUtil
							.showPrice(String.valueOf(monthEndMoney)));
					totalInCount += productInCount;
					totalInMoney += productInMoney;
					totalOutCount += productOutCount;
					totalOutMoney += productOutMoney;
					totalMonthStorageCount += productMonthCount;
					totalMonthStorageMoney += productMonthMoney;
					totalMonthEndCount += monthEndCount;
					totalMonthEndMoney += monthEndMoney;
					index++;
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 5);
					HSSFCell cell_1 = tRow.createCell((short) 8);
					HSSFCell cell_2 = tRow.createCell((short) 9);
					HSSFCell cell_3 = tRow.createCell((short) 10);
					HSSFCell cell_4 = tRow.createCell((short) 11);
					HSSFCell cell_5 = tRow.createCell((short) 12);
					HSSFCell cell_6 = tRow.createCell((short) 13);
					HSSFCell cell_7 = tRow.createCell((short) 14);
					HSSFCell cell_8 = tRow.createCell((short) 15);
					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);
					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
					zongjiCell.setCellValue("合计:");
					cell_1.setCellValue(StringUtil.showCount(String
							.valueOf(totalMonthStorageCount)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthStorageMoney)));
					cell_3.setCellValue(StringUtil.showCount(String
							.valueOf(totalInCount)));
					cell_4.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney)));
					cell_5.setCellValue(StringUtil.showCount(String
							.valueOf(totalOutCount)));
					cell_6.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney)));
					cell_7.setCellValue(StringUtil.showCount(String
							.valueOf(totalMonthEndCount)));
					cell_8.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthEndMoney)));
				}
			}

			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}
	/** EXCEL 处理 报表① */
	private void writeExcel_ReportRepairDetail(String warehouseCode,String title,String title1,String fileName,Map map,List list, String start,
			String end,HttpServletRequest request,
			HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			GSMonthInfoDao gmi = new GSMonthInfoDao();
			GSProviderDAO  proDao = new GSProviderDAO();
			/** 创建通用EXCEL 开始 */
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = null;
			HSSFRow tRow = null;
			Region region = null;
			HSSFCell c0 = null;
			HSSFCell c1 = null;
			HSSFCell c2 = null;
			HSSFCell c3 = null;
			HSSFCell c4 = null;
			HSSFCell c5 = null;
			HSSFCell c6 = null;
			HSSFCell c7 = null;
			HSSFCell c8 = null;
			HSSFCell c9 = null;
			HSSFCell c10 = null;
			HSSFCell c11 = null;
			HSSFCell c12 = null;
			
			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);
			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);
		
			
			/** 创建通用EXCEL 结束 */

			/** 创建Sheet 开始 */
			

				short index = 2; // 当前所在行号
				double totalOutCount = 0;
				double totalOutMoney = 0;
				double totalProviderCount = 0;
				double totalProviderMoney = 0;

				// 创建 sheet
				tSheet = tWb.createSheet();
				tWb.setSheetName(0, "外修领用报表",
						HSSFCell.ENCODING_UTF_16);
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				
				// 标题行
				tRow = tSheet.createRow((short) 0);
				c0 = createCell(tWb, tRow, (short) 5, title1);
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 9, 1, (short) 13);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 6, "日期  " + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
	
				// 表头行
				tRow = tSheet.createRow((short) 2);
				c1 = createCell(tWb, tRow, (short) 0, "产品编码");
				c2 = createCell(tWb, tRow, (short) 1, "自编码");
				c3 = createCell(tWb, tRow, (short) 2, "产品名称");
				c4 = createCell(tWb, tRow, (short) 3, "规格");
				c5 = createCell(tWb, tRow, (short) 4, "型号");
				c6 = createCell(tWb, tRow, (short) 5, "品牌");
				c7 = createCell(tWb, tRow, (short) 6, "单位");
				c8 = createCell(tWb, tRow, (short) 7, "单价");
				c9 = createCell(tWb, tRow, (short) 8, "领出数量");
				c10 = createCell(tWb, tRow, (short) 9, "领出金额");
				c11 = createCell(tWb, tRow, (short) 10, "供应商");
				c12 = createCell(tWb, tRow, (short) 11, "适用车型");
	
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				c10.setCellStyle(cStyleM_R);
				c11.setCellStyle(cStyleM_R);
				c12.setCellStyle(cStyleM_R);

				c0.setCellStyle(cStyleM_R);
				// 期初计算
				for (int i = 0; i < list.size(); i++) {
					totalProviderCount = 0;
					totalProviderMoney = 0;
					String providerCode=(String)list.get(i);
					GSProviderBean provider=proDao.queryProvider(providerCode);
					List aList=gmi.selectProductDetails(warehouseCode, providerCode,start,end);
					for(int j=0;j<aList.size();j++){
						GSProductApepBean bean=(GSProductApepBean)aList.get(j);
						// 創建一行
						tRow = tSheet.createRow((short) (index + 1));
						createCell(tWb, tRow, (short) 0, bean.getConcentricity_code());
						createCell(tWb, tRow, (short) 1, bean.getApep_code());
						createCell(tWb, tRow, (short) 2, bean.getName());
						createCell(tWb, tRow, (short) 3, bean.getSpec());
						createCell(tWb, tRow, (short) 4, bean.getModel());
						createCell(tWb, tRow, (short) 5, bean.getProduct_brand());
						createCell(tWb, tRow, (short) 6, bean.getProduct_unit());
						createCell(tWb, tRow, (short) 7, bean.getBalance_mode());
						createCell(tWb, tRow, (short) 8, bean.getManufaturer());
						createCell(tWb, tRow, (short) 9, bean.getArea());
						createCell(tWb, tRow, (short) 10, provider.getGs_provider_shortname());
						createCell(tWb, tRow, (short) 11, bean.getAdapt_machine_type());
						double count=Double.parseDouble(bean.getManufaturer());
						totalProviderCount+=count;
						double money=Double.parseDouble(bean.getArea());
						totalProviderMoney+=money;
						index++;
					}
					tRow = tSheet.createRow((short) (index + 1));
					HSSFCell xiaojiCell = tRow.createCell((short) 5);
					HSSFCell cell_1 = tRow.createCell((short) 8);
					HSSFCell cell_2 = tRow.createCell((short) 9);
					xiaojiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					xiaojiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
					xiaojiCell.setCellValue("小计:");
					cell_1.setCellValue(StringUtil.showCount(String
							.valueOf(totalProviderCount)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalProviderMoney)));
					totalOutCount+=totalProviderCount;
					totalOutMoney+=totalProviderMoney;
					index++;
				
					
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 5);
					HSSFCell cell_1 = tRow.createCell((short) 8);
					HSSFCell cell_2 = tRow.createCell((short) 9);
					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
					zongjiCell.setCellValue("合计:");
					cell_1.setCellValue(StringUtil.showCount(String
							.valueOf(totalOutCount)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney)));
				}

			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}
	
	/** EXCEL 处理 报表① */
	private void writeExcel_ReportRepairSum(String title,String title1,String fileName,Map map,List list, String start,
			String end,HttpServletRequest request,
			HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			/** 创建通用EXCEL 开始 */
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = null;
			HSSFRow tRow = null;
			Region region = null;
			HSSFCell c0 = null;
			HSSFCell c1 = null;
			HSSFCell c2 = null;
			HSSFCell c3 = null;
			HSSFCell c4 = null;
			
			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);
			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);
		
			
			/** 创建通用EXCEL 结束 */

			/** 创建Sheet 开始 */
			

				short index = 2; // 当前所在行号
				double totalInCount = 0;
				double totalInMoney = 0;
				double totalOutCount = 0;

				// 创建 sheet
				tSheet = tWb.createSheet();
				tWb.setSheetName(0, "外修领用汇总报表",
						HSSFCell.ENCODING_UTF_16);
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				
				// 标题行
				tRow = tSheet.createRow((short) 0);
				c0 = createCell(tWb, tRow, (short) 5, title1);
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 9, 1, (short) 13);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 1, "日期  " + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
	
				// 表头行
				tRow = tSheet.createRow((short) 2);
				c1 = createCell(tWb, tRow, (short) 0, "仓库名称");
				c2 = createCell(tWb, tRow, (short) 1, "压库领用");
				c3 = createCell(tWb, tRow, (short) 2, "买断领用");
				c4 = createCell(tWb, tRow, (short) 3, "合计");
	
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				
				c0.setCellStyle(cStyleM_R);
				// 期初计算
				for (int i = 0; i < list.size(); i++) {
					String warehouseName=(String)list.get(i);
					String ykjz=(String)map.get(warehouseName+"-1");
					String mdjz=(String)map.get(warehouseName+"-2");
					BigDecimal totalMoney=new BigDecimal(ykjz).add(new BigDecimal(mdjz));
					// 創建一行
					tRow = tSheet.createRow((short) (index + 1));
					createCell(tWb, tRow, (short) 0, warehouseName);
					createCell(tWb, tRow, (short) 1, ykjz);
					createCell(tWb, tRow, (short) 2, mdjz);
					createCell(tWb, tRow, (short) 3, totalMoney+"");
					totalInCount += new BigDecimal(ykjz).doubleValue();
					totalInMoney += new BigDecimal(mdjz).doubleValue();
					totalOutCount += totalMoney.doubleValue();
					index++;
				
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 0);
					HSSFCell cell_1 = tRow.createCell((short) 1);
					HSSFCell cell_2 = tRow.createCell((short) 2);
					HSSFCell cell_3 = tRow.createCell((short) 3);
					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
					zongjiCell.setCellValue("合计:");
					cell_1.setCellValue(StringUtil.showCount(String
							.valueOf(totalInCount)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney)));
					cell_3.setCellValue(StringUtil.showCount(String
							.valueOf(totalOutCount)));
				}

			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}


	/** 供应商内部类 */
	class ProviderTemp {
		// 供应商编码
		public String providerCode = "";
		// 供应商名称
		public String ProviderName = "";
		public ObjectList listOut = null;
		public ObjectList listIn = null;
		public ObjectList list = null;
	}

	/** 在一个月中 已给出时间 最早start,最终得到 本月的第一天和早于start的最晚时间 */
	private String[] getBeforetime(String start) {
		String[] strs = new String[] { "9999-99-99 99:99:99",
				"0000-00-00 00:00:00" };
		StringBuffer beforeStart = new StringBuffer(start);
		StringBuffer beforeEnd = new StringBuffer(start);
		beforeStart = beforeStart.replace(8, 10, "01");
		int day = Integer.parseInt(String.valueOf(start.subSequence(8, 10)));
		if (day > 1) {
			day--;
		} else {
			return strs;
		}
		String strDay = null;
		if (day < 10) {
			strDay = "0" + day;
		} else {
			strDay = String.valueOf(day);
		}
		beforeEnd = beforeEnd.replace(8, 10, strDay);
		String str1 = String.valueOf(beforeStart);
		String str2 = String.valueOf(beforeEnd);
		strs[0] = str1 + " 00:00:00";
		strs[1] = str2 + " 23:59:59";
		return strs;
	}

	private void writeExcel_ReportSeventh(Vector vec, String warehouseCode,
			String month, String title, String fileName, String title1,
			HttpServletRequest request, HttpServletResponse response,
			String start, String end, DBConnection con) {
		ServletOutputStream out = null;
		try {
			/** 创建通用EXCEL 开始 */
			HSSFWorkbook tWb = new HSSFWorkbook();
			HSSFSheet tSheet = null;
			HSSFRow tRow = null;
			Region region = null;
			HSSFCell c0 = null;
			HSSFCell c1 = null;
			HSSFCell c2 = null;
			HSSFCell c3 = null;
			HSSFCell c4 = null;
			HSSFCell c5 = null;
			HSSFCell c6 = null;
			HSSFCell c7 = null;
			HSSFCell c8 = null;
			HSSFCell c9 = null;
			HSSFCell c10 = null;
			HSSFCell c11 = null;
			HSSFCell c12 = null;
			HSSFCell c13 = null;
			HSSFCell c14 = null;
			HSSFCell c15 = null;
			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);
			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);
			/** 创建通用EXCEL 结束 */

			/** 创建Sheet 开始 */
			int size = vec.size();// 获得结果集大小
			boolean needNew = true;// 标示变量 当需要创建一个新的sheet页的时候 值为true
			String category_code1 = null;// 存储索引i的类别编号
			String category_code2 = null;// 存储索引i+1的类别编号
			String category_name = null;// 当前的类别名称
			short index = 2; // 当前所在行号
			double totalMonthStorageMoney = 0;// 一个sheet中用来统计合计
			double totalMonthStorageCount = 0;// 一个sheet中用来统计合计
			double totalInCount = 0;// 一个sheet中用来统计合计
			double totalInMoney = 0;// 一个sheet中用来统计合计
			double totalOutCount = 0;// 一个sheet中用来统计合计
			double totalOutMoney = 0;// 一个sheet中用来统计合计
			double totalMonthEndCount = 0;// 一个sheet中用来统计合计
			double totalMonthEndMoney = 0;// 一个sheet中用来统计合计
			int sheetIndex = 0;// sheet创建所需要的索引
			for (int k = 0; k < size; k++) {
				System.out.println(k);
				Map map1 = (Map) vec.get(k);
				Map map2 = null;
				category_name = map1.get("CATE_NAME") == null ? ""
						: (String) map1.get("CATE_NAME");// 获取当前索引的类型名称
				if (size > 1 && k != size - 1) {
					map2 = (Map) vec.get(k + 1);// 如果集合大于2并且当前不是最后一位索引
				}
				// 获取下一位索引的对象
				if (map2 != null) {
					category_code1 = (String) map1.get("CATEGORY_CODE");
					category_code2 = (String) map2.get("CATEGORY_CODE");
				}
				// 创建 sheet 当条件满足时
				if (needNew) {
					tSheet = tWb.createSheet();
					tWb.setSheetName(sheetIndex, category_name,
							HSSFCell.ENCODING_UTF_16);
					tSheet.setColumnWidth((short) 0, (short) (16 * 256));
					tSheet.setColumnWidth((short) 1, (short) (12 * 256));
					tSheet.setColumnWidth((short) 2, (short) (12 * 256));
					tSheet.setColumnWidth((short) 3, (short) (18 * 256));
					tSheet.setColumnWidth((short) 4, (short) (10 * 256));
					tSheet.setColumnWidth((short) 5, (short) (10 * 256));
					tSheet.setColumnWidth((short) 6, (short) (10 * 256));
					tSheet.setColumnWidth((short) 7, (short) (10 * 256));
					tSheet.setColumnWidth((short) 8, (short) (10 * 256));
					tSheet.setColumnWidth((short) 9, (short) (12 * 256));
					tSheet.setColumnWidth((short) 10, (short) (14 * 256));
					tSheet.setColumnWidth((short) 11, (short) (14 * 256));
					tSheet.setColumnWidth((short) 12, (short) (14 * 256));
					tSheet.setColumnWidth((short) 13, (short) (14 * 256));
					tSheet.setColumnWidth((short) 14, (short) (14 * 256));
					tSheet.setColumnWidth((short) 15, (short) (14 * 256));
					// 标题行
					tRow = tSheet.createRow((short) 0);
					c0 = createCell(tWb, tRow, (short) 5, title1);
					c0.setCellStyle(cStyleM);
					// 日期行
					tRow = tSheet.createRow((short) 1);
					region = new Region(1, (short) 9, 1, (short) 13);
					tSheet.addMergedRegion(region);
					createCell(tWb, tRow, (short) 9, "产品分类:" + category_name
							+ "     " + start + " 至 " + end,
							HSSFCellStyle.ALIGN_CENTER, false);
					// 表头行
					tRow = tSheet.createRow((short) 2);
					c1 = createCell(tWb, tRow, (short) 0, "产品编码");
					c2 = createCell(tWb, tRow, (short) 1, "自编码");
					c3 = createCell(tWb, tRow, (short) 2, "产品名称");
					c4 = createCell(tWb, tRow, (short) 3, "规格");
					c5 = createCell(tWb, tRow, (short) 4, "型号");
					c6 = createCell(tWb, tRow, (short) 5, "品牌");
					c7 = createCell(tWb, tRow, (short) 6, "单位");
					c8 = createCell(tWb, tRow, (short) 7, "单价");
					c9 = createCell(tWb, tRow, (short) 8, "期初数量");
					c10 = createCell(tWb, tRow, (short) 9, "期初金额");
					c11 = createCell(tWb, tRow, (short) 10, "入库数量");
					c12 = createCell(tWb, tRow, (short) 11, "入库金额");
					c13 = createCell(tWb, tRow, (short) 12, "领出数量");
					c14 = createCell(tWb, tRow, (short) 13, "领出金额");
					c15 = createCell(tWb, tRow, (short) 14, "期末数量");
					c0 = createCell(tWb, tRow, (short) 15, "期末金额");
					c1.setCellStyle(cStyleM_R);
					c2.setCellStyle(cStyleM_R);
					c3.setCellStyle(cStyleM_R);
					c4.setCellStyle(cStyleM_R);
					c5.setCellStyle(cStyleM_R);
					c6.setCellStyle(cStyleM_R);
					c7.setCellStyle(cStyleM_R);
					c8.setCellStyle(cStyleM_R);
					c9.setCellStyle(cStyleM_R);
					c10.setCellStyle(cStyleM_R);
					c11.setCellStyle(cStyleM_R);
					c12.setCellStyle(cStyleM_R);
					c13.setCellStyle(cStyleM_R);
					c14.setCellStyle(cStyleM_R);
					c15.setCellStyle(cStyleM_R);
					c0.setCellStyle(cStyleM_R);
					sheetIndex++;
					needNew = false;
				}
				double productMonthMoney = 0;// 用来统计单行数据的
				double productMonthCount = 0;// 用来统计单行数据的
				double productInCount = 0;// 用来统计单行数据的
				double productInMoney = 0;// 用来统计单行数据的
				double productOutCount = 0;// 用来统计单行数据的
				double productOutMoney = 0;// 用来统计单行数据的
				double monthEndCount = 0;// 用来统计单行数据的
				double monthEndMoney = 0;// 用来统计单行数据的

				/** 获取本行中的数字数据 */
				productMonthCount = Double.parseDouble((String) map1
						.get("INIT_COUNT"));
				productMonthMoney = Double.parseDouble((String) map1
						.get("INIT_MONEY"));
				productInCount = Double.parseDouble((String) map1
						.get("IN_COUNT"));
				productInMoney = Double.parseDouble((String) map1
						.get("IN_MONEY"));
				productOutCount = Double.parseDouble((String) map1
						.get("OUT_COUNT"));
				productOutMoney = Double.parseDouble((String) map1
						.get("OUT_MONEY"));
				monthEndCount = Double.parseDouble((String) map1
						.get("FINAL_COUNT"));
				monthEndMoney = Double.parseDouble((String) map1
						.get("FINAL_MONEY"));
				/** 获取本行中的数字数据 */

				/** 为单元格填充相应数据 */
				tRow = tSheet.createRow((short) (index + 1));
				createCell(tWb, tRow, (short) 0,
						map1.get("CONCENTRICITY_CODE") == null ? ""
								: (String) map1.get("CONCENTRICITY_CODE"));
				createCell(tWb, tRow, (short) 1,
						map1.get("APEP_CODE") == null ? "" : (String) map1
								.get("APEP_CODE"));
				createCell(tWb, tRow, (short) 2, map1.get("NAME") == null ? ""
						: (String) map1.get("NAME"));
				createCell(tWb, tRow, (short) 3, map1.get("SPEC") == null ? ""
						: (String) map1.get("SPEC"));
				createCell(tWb, tRow, (short) 4, map1.get("MODEL") == null ? ""
						: (String) map1.get("MODEL"));
				createCell(tWb, tRow, (short) 5,
						map1.get("PRODUCT_BRAND") == null ? "" : (String) map1
								.get("PRODUCT_BRAND"));
				createCell(tWb, tRow, (short) 6,
						map1.get("PRODUCT_UNIT") == null ? "" : (String) map1
								.get("PRODUCT_UNIT"));
				createCell(tWb, tRow, (short) 7, StringUtil.showCount(String
						.valueOf(Double.parseDouble((String) map1
								.get("PRODUCT_PRICE")))));
				createCell(tWb, tRow, (short) 8, StringUtil.showCount(String
						.valueOf(productMonthCount)));
				createCell(tWb, tRow, (short) 9, StringUtil.showPrice(String
						.valueOf(productMonthMoney)));
				createCell(tWb, tRow, (short) 10, StringUtil.showCount(String
						.valueOf(productInCount)));
				createCell(tWb, tRow, (short) 11, StringUtil.showPrice(String
						.valueOf(productInMoney)));
				createCell(tWb, tRow, (short) 12, StringUtil.showCount(String
						.valueOf(productOutCount)));
				createCell(tWb, tRow, (short) 13, StringUtil.showPrice(String
						.valueOf(productOutMoney)));
				createCell(tWb, tRow, (short) 14, StringUtil.showCount(String
						.valueOf(monthEndCount)));
				createCell(tWb, tRow, (short) 15, StringUtil.showPrice(String
						.valueOf(monthEndMoney)));
				/** 为单元格填充相应数据 */

				/** 累加本行数据 */
				totalInCount += productInCount;
				totalInMoney += productInMoney;
				totalOutCount += productOutCount;
				totalOutMoney += productOutMoney;
				totalMonthStorageCount += productMonthCount;
				totalMonthStorageMoney += productMonthMoney;
				totalMonthEndCount += monthEndCount;
				totalMonthEndMoney += monthEndMoney;
				index++;
				/** 累加本行数据 */

				// 当发现 索引i与索引i+1的类别不同时
				if (!category_code1.equals(category_code2)) {
					needNew = true;
				}
				// 当发现本索引是集合最后一位时
				if (k == size - 1) {
					needNew = true;
				}
				// 如果本页行数大于2 并且 下一个索引的类别和本索引类别不同 结束本页 并填充本页合计
				if (index > 2 && needNew) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 5);
					HSSFCell cell_1 = tRow.createCell((short) 8);
					HSSFCell cell_2 = tRow.createCell((short) 9);
					HSSFCell cell_3 = tRow.createCell((short) 10);
					HSSFCell cell_4 = tRow.createCell((short) 11);
					HSSFCell cell_5 = tRow.createCell((short) 12);
					HSSFCell cell_6 = tRow.createCell((short) 13);
					HSSFCell cell_7 = tRow.createCell((short) 14);
					HSSFCell cell_8 = tRow.createCell((short) 15);
					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);
					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
					zongjiCell.setCellValue("合计:");
					cell_1.setCellValue(StringUtil.showCount(String
							.valueOf(totalMonthStorageCount)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthStorageMoney)));
					cell_3.setCellValue(StringUtil.showCount(String
							.valueOf(totalInCount)));
					cell_4.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney)));
					cell_5.setCellValue(StringUtil.showCount(String
							.valueOf(totalOutCount)));
					cell_6.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney)));
					cell_7.setCellValue(StringUtil.showCount(String
							.valueOf(totalMonthEndCount)));
					cell_8.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthEndMoney)));

					/** sheet统计数据回零 */
					index = 2; // 当前所在行号
					totalMonthStorageMoney = 0;
					totalMonthStorageCount = 0;
					totalInCount = 0;
					totalInMoney = 0;
					totalOutCount = 0;
					totalOutMoney = 0;
					totalMonthEndCount = 0;
					totalMonthEndMoney = 0;
					/** sheet统计数据回零 */
				}
			}

			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 报表14 仓储系统入.出.存资金汇总月报
	 * 
	 */
	private void writeExcel(List list, String fileName,
			HttpServletResponse response, int year, int month) throws Exception {
		HSSFWorkbook book = new HSSFWorkbook();// 创建主文件
		HSSFSheet sheet = book.createSheet();// 创建sheet
		HSSFRow customRow = null;// 创建行

		String title = year + "年" + month + "月仓储系统入.出.存资金汇总月报";
		book.setSheetName(0, title, HSSFCell.ENCODING_UTF_16);// 设置sheet名称

		HSSFFont font = book.createFont();// 设置字体
		font.setFontHeightInPoints((short) 9);// 设置字体
		font.setFontName("宋体");// 设置字体
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体

		HSSFCellStyle cStyle = book.createCellStyle();// 设置单元格样式
		cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 右对齐

		HSSFCellStyle cStyleM = book.createCellStyle();// 设置单元格样式
		cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中
		cStyleM.setFont(font);// 设置单元格字体

		HSSFCellStyle cStyleM_R = book.createCellStyle();// 设置单元格样式
		cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 右对齐
		cStyleM_R.setFont(font);// 设置单元格字体

		customRow = sheet.createRow((short) 0);// 标题行
		Region region = new Region(0, (short) 0, 0, (short) 9);// 合并0行0列到0行9列
		sheet.addMergedRegion(region);
		HSSFCell cTitle = createCell(book, customRow, (short) 0, title);// 设置标题行名称
		cTitle.setCellStyle(cStyleM);// 设置对其样式

		customRow = sheet.createRow((short) 1);// 创建列标头行
		HSSFCell c0 = createCell(book, customRow, (short) 0, "单位");
		HSSFCell c1 = createCell(book, customRow, (short) 1, "结算模式");
		HSSFCell c2 = createCell(book, customRow, (short) 2, "期初金额");
		HSSFCell c3 = createCell(book, customRow, (short) 3, "入库金额");
		HSSFCell c4 = createCell(book, customRow, (short) 4, "出库金额");
		HSSFCell c5 = createCell(book, customRow, (short) 5, "入出库金额合计");
		HSSFCell c6 = createCell(book, customRow, (short) 6, "期未金额");
		HSSFCell c7 = createCell(book, customRow, (short) 7, "入库单据(张)");
		HSSFCell c8 = createCell(book, customRow, (short) 8, "出库单据(张)");
		HSSFCell c9 = createCell(book, customRow, (short) 9, "入出库单合计(张)");

		c0.setCellStyle(cStyleM);
		c1.setCellStyle(cStyleM);
		c2.setCellStyle(cStyleM);
		c3.setCellStyle(cStyleM);
		c4.setCellStyle(cStyleM);
		c5.setCellStyle(cStyleM);
		c6.setCellStyle(cStyleM);
		c7.setCellStyle(cStyleM);
		c8.setCellStyle(cStyleM);
		c9.setCellStyle(cStyleM);

		int size = list.size();

		// 统计单一仓库
		String balanceMode = "";
		double initMoney = 0;
		double inMoney = 0;
		double outMoney = 0;
		double inAndOutMoney = 0;
		double finalMoney = 0;
		int inBillCount = 0;
		int outBillCount = 0;
		int inAndOutBillCount = 0;

		// 统计所有仓库
		double initMoneyFinally = 0;
		double inMoneyFinally = 0;
		double outMoneyFinally = 0;
		double inAndOutMoneyFinally = 0;
		double finalMoneyFinally = 0;
		int inBillCountFinally = 0;
		int outBillCountFinally = 0;
		int inAndOutBillCountFinally = 0;

		// 统计所有仓库压库数据
		double initMoneyFinallyYK = 0;
		double inMoneyFinallyYK = 0;
		double outMoneyFinallyYK = 0;
		double inAndOutMoneyFinallyYK = 0;
		double finalMoneyFinallyYK = 0;
		int inBillCountFinallyYK = 0;
		int outBillCountFinallyYK = 0;
		int inAndOutBillCountFinallyYK = 0;

		// 统计所有仓库买断数据
		double initMoneyFinallyMD = 0;
		double inMoneyFinallyMD = 0;
		double outMoneyFinallyMD = 0;
		double inAndOutMoneyFinallyMD = 0;
		double finalMoneyFinallyMD = 0;
		int inBillCountFinallyMD = 0;
		int outBillCountFinallyMD = 0;
		int inAndOutBillCountFinallyMD = 0;

		int index = 2;// 为实际数据生成创建行索引
		int rowSpanIndex = 2;// 合并仓库名称列所需要的行索引
		HSSFRow warehouseNameRow = null;// 用于保留合并仓库名称后设置仓库名称
		/**
		 * 提取数据 开始
		 * 在提取过程中,默认list的大小是偶数的,并且应该是(仓库数×2;"两种结算模式").如果今后结算模式发生变化.此报表须作调整
		 * 所以,在上述条件情况,数据提取做出针对性的设计.即:每次提取一个仓库的所有结算模式数据(每次两条).然后做数据处理.
		 */
		for (int i = 0; i < size; i++) {
			Map map1 = (Map) list.get(i);// 获取当前行
			Map map2 = null;
			String warehouseName1 = "";
			String warehouseName2 = "default value";

			warehouseName1 = (String) map1.get("NAME");
			if (i != size - 1) {
				map2 = (Map) list.get(i + 1);// 获取次行
				warehouseName2 = (String) map2.get("NAME");
			}

			// 获取当前行数据
			String balanceMode1 = Integer.parseInt((String) map1
					.get("BALANCE_MODE")) == 1 ? "压库" : "买断";
			double initMoney1 = Double.parseDouble((String) map1
					.get("INIT_MONEY"));
			double inMoney1 = Double.parseDouble((String) map1.get("IN_MONEY"));
			double outMoney1 = Double.parseDouble((String) map1
					.get("OUT_MONEY"));
			double inAndOutMoney1 = Double.parseDouble((String) map1
					.get("IN_AND_OUT_MONEY"));
			double finalMoney1 = Double.parseDouble((String) map1
					.get("FINAL_MONEY"));
			int inBillCount1 = Integer.parseInt((String) map1
					.get("IN_BILL_COUNT"));
			int outBillCount1 = Integer.parseInt((String) map1
					.get("OUT_BILL_COUNT"));
			int inAndOutBillCount1 = Integer.parseInt((String) map1
					.get("IN_AND_OUT_BILL_COUNT"));

			if (balanceMode1.equals("压库")) {
				initMoneyFinallyYK = initMoneyFinallyYK + initMoney1;
				inMoneyFinallyYK = inMoneyFinallyYK + inMoney1;
				outMoneyFinallyYK = outMoneyFinallyYK + outMoney1;
				inAndOutMoneyFinallyYK = inAndOutMoneyFinallyYK
						+ inAndOutMoney1;
				finalMoneyFinallyYK = inAndOutMoneyFinallyYK + finalMoney1;
				inBillCountFinallyYK = inBillCountFinallyYK + inBillCount1;
				outBillCountFinallyYK = outBillCountFinallyYK + outBillCount1;
				inAndOutBillCountFinallyYK = inAndOutBillCountFinallyYK
						+ inAndOutBillCount1;
			} else {
				initMoneyFinallyMD = initMoneyFinallyMD + initMoney1;
				inMoneyFinallyMD = inMoneyFinallyMD + inMoney1;
				outMoneyFinallyMD = outMoneyFinallyMD + outMoney1;
				inAndOutMoneyFinallyMD = inAndOutMoneyFinallyMD
						+ inAndOutMoney1;
				finalMoneyFinallyMD = inAndOutMoneyFinallyMD + finalMoney1;
				inBillCountFinallyMD = inBillCountFinallyMD + inBillCount1;
				outBillCountFinallyMD = outBillCountFinallyMD + outBillCount1;
				inAndOutBillCountFinallyMD = inAndOutBillCountFinallyMD
						+ inAndOutBillCount1;
			}

			// 合计当前仓库数据
			initMoney = initMoney + initMoney1;
			inMoney = inMoney + inMoney1;
			outMoney = outMoney + outMoney1;
			inAndOutMoney = inAndOutMoney + inAndOutMoney1;
			finalMoney = finalMoney + finalMoney1;
			inBillCount = inBillCount + inBillCount1;
			outBillCount = outBillCount + outBillCount1;
			inAndOutBillCount = inAndOutBillCount + inAndOutBillCount1;

			// 创建当前行数据
			HSSFRow row = sheet.createRow((short) index++);
			if (warehouseNameRow == null) {
				warehouseNameRow = row;// 保留每一个仓库的首行
			}
			// createCell(book, row, (short) 0, warehouseName1);
			createCell(book, row, (short) 1, balanceMode1);
			createCell(book, row, (short) 2, StringUtil.showPrice(String
					.valueOf(initMoney1)));
			createCell(book, row, (short) 3, StringUtil.showPrice(String
					.valueOf(inMoney1)));
			createCell(book, row, (short) 4, StringUtil.showPrice(String
					.valueOf(outMoney1)));
			createCell(book, row, (short) 5, StringUtil.showPrice(String
					.valueOf(inAndOutMoney1)));
			createCell(book, row, (short) 6, StringUtil.showPrice(String
					.valueOf(finalMoney1)));
			createCell(book, row, (short) 7, String.valueOf(inBillCount1));
			createCell(book, row, (short) 8, String.valueOf(outBillCount1));
			createCell(book, row, (short) 9, String.valueOf(inAndOutBillCount1));
			// 判断是否还属于同一仓库数据
			if (warehouseName1.equals(warehouseName2)) {
				// 仍属于同一仓库数据
				// 不生成合计
			} else {
				// 已经不属于同一仓库数据
				// 生成合计
				row = sheet.createRow((short) index++);
				Region rowSpan = new Region(rowSpanIndex, (short) 0, index - 1,
						(short) 0);// 合并仓库名称列
				sheet.addMergedRegion(rowSpan);
				HSSFCell warehouseCell = createCell(book, warehouseNameRow,
						(short) 0, warehouseName1);// 用保留下来的仓库首行来设置仓库名称
				warehouseCell.setCellStyle(cStyleM);// 设置仓库名称样式
				HSSFCell cell = createCell(book, row, (short) 1, "合计");
				cell.setEncoding(HSSFCell.ENCODING_UTF_16);
				createCell(book, row, (short) 2, StringUtil.showPrice(String
						.valueOf(initMoney)));
				createCell(book, row, (short) 3, StringUtil.showPrice(String
						.valueOf(inMoney)));
				createCell(book, row, (short) 4, StringUtil.showPrice(String
						.valueOf(outMoney)));
				createCell(book, row, (short) 5, StringUtil.showPrice(String
						.valueOf(inAndOutMoney)));
				createCell(book, row, (short) 6, StringUtil.showPrice(String
						.valueOf(finalMoney)));
				createCell(book, row, (short) 7, String.valueOf(inBillCount));
				createCell(book, row, (short) 8, String.valueOf(outBillCount));
				createCell(book, row, (short) 9, String
						.valueOf(inAndOutBillCount));

				// 累计本仓库数据
				initMoneyFinally = initMoneyFinally + initMoney;
				inMoneyFinally = inMoneyFinally + inMoney;
				outMoneyFinally = outMoneyFinally + outMoney;
				inAndOutMoneyFinally = inAndOutMoneyFinally + inAndOutMoney;
				finalMoneyFinally = inAndOutMoneyFinally + finalMoney;
				inBillCountFinally = inBillCountFinally + inBillCount;
				outBillCountFinally = outBillCountFinally + outBillCount;
				inAndOutBillCountFinally = inAndOutBillCountFinally
						+ inAndOutBillCount;

				// 单一仓库合计归零
				initMoney = 0;
				inMoney = 0;
				outMoney = 0;
				inAndOutMoney = 0;
				finalMoney = 0;
				inBillCount = 0;
				outBillCount = 0;
				inAndOutBillCount = 0;
				rowSpanIndex = index;
				warehouseNameRow = null;
			}
		}

		HSSFRow row = sheet.createRow((short) index++);
		Region lastSpan = new Region(index - 1, (short) 0, index - 1, (short) 1);// 合并最后一行
		sheet.addMergedRegion(lastSpan);
		createCell(book, row, (short) 0, "压库合计");
		createCell(book, row, (short) 2, StringUtil.showPrice(String
				.valueOf(initMoneyFinallyYK)));
		createCell(book, row, (short) 3, StringUtil.showPrice(String
				.valueOf(inMoneyFinallyYK)));
		createCell(book, row, (short) 4, StringUtil.showPrice(String
				.valueOf(outMoneyFinallyYK)));
		createCell(book, row, (short) 5, StringUtil.showPrice(String
				.valueOf(inAndOutMoneyFinallyYK)));
		createCell(book, row, (short) 6, StringUtil.showPrice(String
				.valueOf(finalMoneyFinallyYK)));
		createCell(book, row, (short) 7, String.valueOf(inBillCountFinallyYK));
		createCell(book, row, (short) 8, String.valueOf(outBillCountFinallyYK));
		createCell(book, row, (short) 9, String
				.valueOf(inAndOutBillCountFinallyYK));

		row = sheet.createRow((short) index++);
		lastSpan = new Region(index - 1, (short) 0, index - 1, (short) 1);// 合并最后一行
		sheet.addMergedRegion(lastSpan);
		createCell(book, row, (short) 0, "买断合计");
		createCell(book, row, (short) 2, StringUtil.showPrice(String
				.valueOf(initMoneyFinallyMD)));
		createCell(book, row, (short) 3, StringUtil.showPrice(String
				.valueOf(inMoneyFinallyMD)));
		createCell(book, row, (short) 4, StringUtil.showPrice(String
				.valueOf(outMoneyFinallyMD)));
		createCell(book, row, (short) 5, StringUtil.showPrice(String
				.valueOf(inAndOutMoneyFinallyMD)));
		createCell(book, row, (short) 6, StringUtil.showPrice(String
				.valueOf(finalMoneyFinallyMD)));
		createCell(book, row, (short) 7, String.valueOf(inBillCountFinallyMD));
		createCell(book, row, (short) 8, String.valueOf(outBillCountFinallyMD));
		createCell(book, row, (short) 9, String
				.valueOf(inAndOutBillCountFinallyMD));

		customRow = sheet.createRow((short) index++);
		lastSpan = new Region(index - 1, (short) 0, index - 1, (short) 1);// 合并最后一行
		sheet.addMergedRegion(lastSpan);
		HSSFCell cell_0 = createCell(book, customRow, (short) 0, "合计:");
		HSSFCell cell_2 = createCell(book, customRow, (short) 2, StringUtil
				.showPrice(String.valueOf(initMoneyFinally)));
		HSSFCell cell_3 = createCell(book, customRow, (short) 3, StringUtil
				.showPrice(String.valueOf(inMoneyFinally)));
		HSSFCell cell_4 = createCell(book, customRow, (short) 4, StringUtil
				.showPrice(String.valueOf(outMoneyFinally)));
		HSSFCell cell_5 = createCell(book, customRow, (short) 5, StringUtil
				.showPrice(String.valueOf(inAndOutMoneyFinally)));
		HSSFCell cell_6 = createCell(book, customRow, (short) 6, StringUtil
				.showPrice(String.valueOf(finalMoneyFinally)));
		HSSFCell cell_7 = createCell(book, customRow, (short) 7, String
				.valueOf(inBillCountFinally));
		HSSFCell cell_8 = createCell(book, customRow, (short) 8, String
				.valueOf(outBillCountFinally));
		HSSFCell cell_9 = createCell(book, customRow, (short) 9, String
				.valueOf(inAndOutBillCountFinally));

		cell_0.setCellStyle(cStyleM_R);
		cell_2.setCellStyle(cStyleM_R);
		cell_3.setCellStyle(cStyleM_R);
		cell_4.setCellStyle(cStyleM_R);
		cell_5.setCellStyle(cStyleM_R);
		cell_6.setCellStyle(cStyleM_R);
		cell_7.setCellStyle(cStyleM_R);
		cell_8.setCellStyle(cStyleM_R);
		cell_9.setCellStyle(cStyleM_R);
		/* 提取数据 结束 */

		fileName = fileName + ".xls";
		response.setHeader("Cache-Control", "No-cache");
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
		response.setDateHeader("Expires", 0);
		response.setContentType("application/ms-excel");
		response.addHeader("Content-disposition", "filename=" + fileName);
		ServletOutputStream out = null;
		out = response.getOutputStream();
		book.write(out);
		out.flush();
		out.close();
	}

	/**
	 * 报表8 买断产品资金进出累计汇总（账本分类）
	 * 
	 * @param aList
	 * @param title
	 * @param start
	 * @param end
	 */
	private void writeExcel_ReportMDWCMoneyInout(List vec, String month,
			String warehouseCode, String fileName, String start, String end,
			HttpServletRequest request, HttpServletResponse response) {
		DBConnection con = null;
		ServletOutputStream out = null;
		boolean parent = false;
		/* 循环形参vec 结构<List>(1:String[2],2.3.4...:String[15]) */
		int size;
		if (vec == null) {
			size = 0;
		} else {
			size = vec.size();
		}
		HSSFWorkbook tWb = new HSSFWorkbook();
		HSSFSheet tSheet = null;
		try {
			for (int k = 0; k < size; k++) {
				List list = (List) vec.get(k);
				String[] warehouseObject = (String[]) list.get(0);
				String name = warehouseObject[1] + "(" + warehouseObject[0]
						+ ")";
				tSheet = tWb.createSheet();
				HSSFRow tRow = null;
				Region region = null;
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				tSheet.setColumnWidth((short) 5, (short) (10 * 256));
				tSheet.setColumnWidth((short) 6, (short) (10 * 256));
				tSheet.setColumnWidth((short) 7, (short) (10 * 256));
				tSheet.setColumnWidth((short) 8, (short) (12 * 256));
				tSheet.setColumnWidth((short) 9, (short) (14 * 256));
				tSheet.setColumnWidth((short) 10, (short) (14 * 256));
				tSheet.setColumnWidth((short) 11, (short) (14 * 256));
				tSheet.setColumnWidth((short) 12, (short) (14 * 256));
				tSheet.setColumnWidth((short) 13, (short) (14 * 256));
				tWb.setSheetName(k, name, HSSFCell.ENCODING_UTF_16);
				HSSFFont font = tWb.createFont();
				font.setFontHeightInPoints((short) 9);
				font.setFontName("宋体");
				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				HSSFCellStyle cStyle = tWb.createCellStyle();
				cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				HSSFCellStyle cStyleM = tWb.createCellStyle();
				cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
				cStyleM.setFont(font);

				HSSFCellStyle cStyleM_R = tWb.createCellStyle();
				cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				cStyleM_R.setFont(font);
				// 标题行
				tRow = tSheet.createRow((short) 0);
				HSSFCell c0 = createCell(tWb, tRow, (short) 4, name
						+ "仓库买断产品资金进出累计汇总(账本分类)");
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 4, 1, (short) 8);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 4, "统计日期:" + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
				// 表头行
				tRow = tSheet.createRow((short) 2);
				HSSFCell c1 = createCell(tWb, tRow, (short) 0, "产品类别");
				HSSFCell c2 = createCell(tWb, tRow, (short) 1, "期初金额");
				HSSFCell c3 = createCell(tWb, tRow, (short) 2, "购入");
				HSSFCell c4 = createCell(tWb, tRow, (short) 3, "盘盈");
				HSSFCell c5 = createCell(tWb, tRow, (short) 4, "入库合计");
				HSSFCell c6 = createCell(tWb, tRow, (short) 5, "领用");
				HSSFCell c7 = createCell(tWb, tRow, (short) 6, "盘亏");
				HSSFCell c8 = createCell(tWb, tRow, (short) 7, "出库合计");
				HSSFCell c9 = createCell(tWb, tRow, (short) 8, "结存");
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				short index = 2; // 当前所在行号

				/** 总信息 */
				double totalMonthMoney = 0;
				double totalInMoney1 = 0;
				double totalInMoney2 = 0;
				double totalAllInMoney = 0;
				double totalOutMoney1 = 0;
				double totalOutMoney2 = 0;
				double totalAllOutMoney = 0;
				double totalMoney = 0;

				con = DBConnection.open(false);
				List newVec = splitWarehouseCategory(list);
				// 缺少为空验证
				int sizeAll = newVec.size();
				// 总集合
				for (int i = 0; i < sizeAll; i++) {
					List subVec = (List) newVec.get(i);
					int sizeSub = subVec.size();
					// 子类集合
					WarehouseCategory wc = null;

					/** 小记信息 */
					double monthMoneyCateCount = 0;
					double productInMoney1CateCount = 0;
					double productInMoney2CateCount = 0;
					double productInMoney3CateCount = 0;
					double productOutMoney1CateCount = 0;
					double productOutMoney2CateCount = 0;
					double productOutMoney3CateCount = 0;
					double allMoneyCateCount = 0;

					for (int j = 0; j < sizeSub; j++) {

						/** 行信息 */
						double monthMoney = 0;
						double productInMoney1 = 0;
						double productInMoney2 = 0;
						double productInMoney3 = 0;
						double productOutMoney1 = 0;
						double productOutMoney2 = 0;
						double productOutMoney3 = 0;
						double allMoney = 0;
						// 缺少为空验证
						// 单一行
						String[] values = (String[]) subVec.get(j);
						if (j == 0) {
							if (values[13].equals("0")) {
								parent = false;
							} else {
								wc = WarehouseCategory.fetchbyCode(con,
										values[13], warehouseObject[0]);
								parent = true;
							}
						}
						monthMoney = Double.parseDouble(values[2]);
						productInMoney1 = Double.parseDouble(values[4]);
						productInMoney2 = Double.parseDouble(values[5]);
						productInMoney3 = Double.parseDouble(values[6]);
						productOutMoney1 = Double.parseDouble(values[8]);
						productOutMoney2 = Double.parseDouble(values[9]);
						productOutMoney3 = Double.parseDouble(values[10]);
						allMoney = Double.parseDouble(values[12]);

						tRow = tSheet.createRow((short) (index + 1));
						createCell(tWb, tRow, (short) 0, values[14]);
						createCell(tWb, tRow, (short) 1, StringUtil
								.showPrice(String.valueOf(monthMoney)));
						createCell(tWb, tRow, (short) 2, StringUtil
								.showPrice(String.valueOf(productInMoney1)));
						createCell(tWb, tRow, (short) 3, StringUtil
								.showPrice(String.valueOf(productInMoney2)));
						createCell(tWb, tRow, (short) 4, StringUtil
								.showPrice(String.valueOf(productInMoney3)));
						createCell(tWb, tRow, (short) 5, StringUtil
								.showPrice(String.valueOf(productOutMoney1)));
						createCell(tWb, tRow, (short) 6, StringUtil
								.showPrice(String.valueOf(productOutMoney2)));
						createCell(tWb, tRow, (short) 7, StringUtil
								.showPrice(String.valueOf(productOutMoney3)));
						createCell(tWb, tRow, (short) 8, StringUtil
								.showPrice(String.valueOf(allMoney)));

						monthMoneyCateCount += monthMoney;
						productInMoney1CateCount += productInMoney1;
						productInMoney2CateCount += productInMoney2;
						productInMoney3CateCount += productInMoney3;
						productOutMoney1CateCount += productOutMoney1;
						productOutMoney2CateCount += productOutMoney2;
						productOutMoney3CateCount += productOutMoney3;
						allMoneyCateCount += allMoney;

						index++;
						if (j + 1 == sizeSub) {
							tRow = tSheet.createRow((short) (index + 1));
							if (parent == true) {
								HSSFCell zongjiCell = tRow
										.createCell((short) 0);
								HSSFCell cell_1 = tRow.createCell((short) 1);
								HSSFCell cell_2 = tRow.createCell((short) 2);
								HSSFCell cell_3 = tRow.createCell((short) 3);
								HSSFCell cell_4 = tRow.createCell((short) 4);
								HSSFCell cell_5 = tRow.createCell((short) 5);
								HSSFCell cell_6 = tRow.createCell((short) 6);
								HSSFCell cell_7 = tRow.createCell((short) 7);
								HSSFCell cell_8 = tRow.createCell((short) 8);

								zongjiCell.setCellStyle(cStyleM_R);
								cell_1.setCellStyle(cStyleM_R);
								cell_2.setCellStyle(cStyleM_R);
								cell_3.setCellStyle(cStyleM_R);
								cell_4.setCellStyle(cStyleM_R);
								cell_5.setCellStyle(cStyleM_R);
								cell_6.setCellStyle(cStyleM_R);
								cell_7.setCellStyle(cStyleM_R);
								cell_8.setCellStyle(cStyleM_R);

								zongjiCell
										.setEncoding(HSSFCell.ENCODING_UTF_16);

								zongjiCell.setCellValue(wc.getCategoryName()
										+ "    小计:");
								cell_1.setCellValue(StringUtil.showPrice(String
										.valueOf(monthMoneyCateCount)));
								cell_2.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney1CateCount)));
								cell_3.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney2CateCount)));
								cell_4.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney3CateCount)));
								cell_5.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney1CateCount)));
								cell_6.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney2CateCount)));
								cell_7.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney3CateCount)));
								cell_8.setCellValue(StringUtil.showPrice(String
										.valueOf(allMoneyCateCount)));
							}
							totalMonthMoney += monthMoneyCateCount;
							totalInMoney1 += productInMoney1CateCount;
							totalInMoney2 += productInMoney2CateCount;
							totalAllInMoney += productInMoney3CateCount;
							totalOutMoney1 += productOutMoney1CateCount;
							totalOutMoney2 += productOutMoney2CateCount;
							totalAllOutMoney += productOutMoney3CateCount;
							totalMoney += allMoneyCateCount;
							index++;
						}
					}
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 0);
					HSSFCell cell_1 = tRow.createCell((short) 1);
					HSSFCell cell_2 = tRow.createCell((short) 2);
					HSSFCell cell_3 = tRow.createCell((short) 3);
					HSSFCell cell_4 = tRow.createCell((short) 4);
					HSSFCell cell_5 = tRow.createCell((short) 5);
					HSSFCell cell_6 = tRow.createCell((short) 6);
					HSSFCell cell_7 = tRow.createCell((short) 7);
					HSSFCell cell_8 = tRow.createCell((short) 8);

					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);

					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);

					zongjiCell.setCellValue("合计：");
					cell_1.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthMoney)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney1)));
					cell_3.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney2)));
					cell_4.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllInMoney)));
					cell_5.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney1)));
					cell_6.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney2)));
					cell_7.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllOutMoney)));
					cell_8.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMoney)));

				}
			}
			fileName = fileName + ".xls";
			response.setHeader("Cache-Control", "No-cache");
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
			response.setDateHeader("Expires", 0);
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();

			tWb.write(out);

			out.flush();
			out.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception ex1) {

			}
		}
	}

	private void writeExcel_ReportWCMoneyInout(List vec, String month,
			String warehouseCode, String fileName, String start, String end,
			HttpServletRequest request, HttpServletResponse response) {
		DBConnection con = null;
		ServletOutputStream out = null;
		boolean parent = false;
		/* 循环形参vec 结构<List>(1:String[2],2.3.4...:String[15]) */
		int size;
		if (vec == null) {
			size = 0;
		} else {
			size = vec.size();
		}
		HSSFWorkbook tWb = new HSSFWorkbook();
		HSSFSheet tSheet = null;
		try {
			for (int k = 0; k < size; k++) {
				List list = (List) vec.get(k);
				String[] warehouseObject = (String[]) list.get(0);
				String name = warehouseObject[1] + "(" + warehouseObject[0]
						+ ")";
				tSheet = tWb.createSheet();
				HSSFRow tRow = null;
				Region region = null;
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				tSheet.setColumnWidth((short) 5, (short) (10 * 256));
				tSheet.setColumnWidth((short) 6, (short) (10 * 256));
				tSheet.setColumnWidth((short) 7, (short) (10 * 256));
				tSheet.setColumnWidth((short) 8, (short) (12 * 256));
				tSheet.setColumnWidth((short) 9, (short) (14 * 256));
				tSheet.setColumnWidth((short) 10, (short) (14 * 256));
				tSheet.setColumnWidth((short) 11, (short) (14 * 256));
				tSheet.setColumnWidth((short) 12, (short) (14 * 256));
				tSheet.setColumnWidth((short) 13, (short) (14 * 256));
				tWb.setSheetName(k, name, HSSFCell.ENCODING_UTF_16);
				HSSFFont font = tWb.createFont();
				font.setFontHeightInPoints((short) 9);
				font.setFontName("宋体");
				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				HSSFCellStyle cStyle = tWb.createCellStyle();
				cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				HSSFCellStyle cStyleM = tWb.createCellStyle();
				cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
				cStyleM.setFont(font);

				HSSFCellStyle cStyleM_R = tWb.createCellStyle();
				cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				cStyleM_R.setFont(font);
				// 标题行
				tRow = tSheet.createRow((short) 0);
				HSSFCell c0 = createCell(tWb, tRow, (short) 4, name
						+ "仓库产品资金进出累计汇总(仓库分类)");
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 4, 1, (short) 8);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 4, "统计日期:" + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
				// 表头行
				tRow = tSheet.createRow((short) 2);
				HSSFCell c1 = createCell(tWb, tRow, (short) 0, "产品类别");
				HSSFCell c2 = createCell(tWb, tRow, (short) 1, "期初金额");
				HSSFCell c3 = createCell(tWb, tRow, (short) 2, "购入");
				HSSFCell c4 = createCell(tWb, tRow, (short) 3, "盘盈");
				HSSFCell c5 = createCell(tWb, tRow, (short) 4, "入库合计");
				HSSFCell c6 = createCell(tWb, tRow, (short) 5, "领用");
				HSSFCell c7 = createCell(tWb, tRow, (short) 6, "盘亏");
				HSSFCell c8 = createCell(tWb, tRow, (short) 7, "出库合计");
				HSSFCell c9 = createCell(tWb, tRow, (short) 8, "结存");
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				short index = 2; // 当前所在行号

				/** 总信息 */
				double totalMonthMoney = 0;
				double totalInMoney1 = 0;
				double totalInMoney2 = 0;
				double totalAllInMoney = 0;
				double totalOutMoney1 = 0;
				double totalOutMoney2 = 0;
				double totalAllOutMoney = 0;
				double totalMoney = 0;

				con = DBConnection.open(false);
				List newVec = splitWarehouseCategory(list);
				// 缺少为空验证
				int sizeAll = newVec.size();
				// 总集合
				for (int i = 0; i < sizeAll; i++) {
					List subVec = (List) newVec.get(i);
					int sizeSub = subVec.size();
					// 子类集合
					WarehouseCategory wc = null;

					/** 小记信息 */
					double monthMoneyCateCount = 0;
					double productInMoney1CateCount = 0;
					double productInMoney2CateCount = 0;
					double productInMoney3CateCount = 0;
					double productOutMoney1CateCount = 0;
					double productOutMoney2CateCount = 0;
					double productOutMoney3CateCount = 0;
					double allMoneyCateCount = 0;

					for (int j = 0; j < sizeSub; j++) {

						/** 行信息 */
						double monthMoney = 0;
						double productInMoney1 = 0;
						double productInMoney2 = 0;
						double productInMoney3 = 0;
						double productOutMoney1 = 0;
						double productOutMoney2 = 0;
						double productOutMoney3 = 0;
						double allMoney = 0;
						// 缺少为空验证
						// 单一行
						String[] values = (String[]) subVec.get(j);
						if (j == 0) {
							if (values[13].equals("0")) {
								parent = false;
							} else {
								wc = WarehouseCategory.fetchbyLikeCode(con,
										values[13], warehouseObject[0]);
								parent = true;
							}
						}
						monthMoney = Double.parseDouble(values[2]);
						productInMoney1 = Double.parseDouble(values[4]);
						productInMoney2 = Double.parseDouble(values[5]);
						productInMoney3 = Double.parseDouble(values[6]);
						productOutMoney1 = Double.parseDouble(values[8]);
						productOutMoney2 = Double.parseDouble(values[9]);
						productOutMoney3 = Double.parseDouble(values[10]);
						allMoney = Double.parseDouble(values[12]);

						tRow = tSheet.createRow((short) (index + 1));
						createCell(tWb, tRow, (short) 0, values[14]);
						createCell(tWb, tRow, (short) 1, StringUtil
								.showPrice(String.valueOf(monthMoney)));
						createCell(tWb, tRow, (short) 2, StringUtil
								.showPrice(String.valueOf(productInMoney1)));
						createCell(tWb, tRow, (short) 3, StringUtil
								.showPrice(String.valueOf(productInMoney2)));
						createCell(tWb, tRow, (short) 4, StringUtil
								.showPrice(String.valueOf(productInMoney3)));
						createCell(tWb, tRow, (short) 5, StringUtil
								.showPrice(String.valueOf(productOutMoney1)));
						createCell(tWb, tRow, (short) 6, StringUtil
								.showPrice(String.valueOf(productOutMoney2)));
						createCell(tWb, tRow, (short) 7, StringUtil
								.showPrice(String.valueOf(productOutMoney3)));
						createCell(tWb, tRow, (short) 8, StringUtil
								.showPrice(String.valueOf(allMoney)));

						monthMoneyCateCount += monthMoney;
						productInMoney1CateCount += productInMoney1;
						productInMoney2CateCount += productInMoney2;
						productInMoney3CateCount += productInMoney3;
						productOutMoney1CateCount += productOutMoney1;
						productOutMoney2CateCount += productOutMoney2;
						productOutMoney3CateCount += productOutMoney3;
						allMoneyCateCount += allMoney;

						index++;
						if (j + 1 == sizeSub) {
							tRow = tSheet.createRow((short) (index + 1));
							if (parent == true) {
								HSSFCell zongjiCell = tRow
										.createCell((short) 0);
								HSSFCell cell_1 = tRow.createCell((short) 1);
								HSSFCell cell_2 = tRow.createCell((short) 2);
								HSSFCell cell_3 = tRow.createCell((short) 3);
								HSSFCell cell_4 = tRow.createCell((short) 4);
								HSSFCell cell_5 = tRow.createCell((short) 5);
								HSSFCell cell_6 = tRow.createCell((short) 6);
								HSSFCell cell_7 = tRow.createCell((short) 7);
								HSSFCell cell_8 = tRow.createCell((short) 8);

								zongjiCell.setCellStyle(cStyleM_R);
								cell_1.setCellStyle(cStyleM_R);
								cell_2.setCellStyle(cStyleM_R);
								cell_3.setCellStyle(cStyleM_R);
								cell_4.setCellStyle(cStyleM_R);
								cell_5.setCellStyle(cStyleM_R);
								cell_6.setCellStyle(cStyleM_R);
								cell_7.setCellStyle(cStyleM_R);
								cell_8.setCellStyle(cStyleM_R);

								zongjiCell
										.setEncoding(HSSFCell.ENCODING_UTF_16);

								zongjiCell.setCellValue(wc.getCategoryName()
										+ "    小计:");
								cell_1.setCellValue(StringUtil.showPrice(String
										.valueOf(monthMoneyCateCount)));
								cell_2.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney1CateCount)));
								cell_3.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney2CateCount)));
								cell_4.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney3CateCount)));
								cell_5.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney1CateCount)));
								cell_6.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney2CateCount)));
								cell_7.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney3CateCount)));
								cell_8.setCellValue(StringUtil.showPrice(String
										.valueOf(allMoneyCateCount)));
							}
							totalMonthMoney += monthMoneyCateCount;
							totalInMoney1 += productInMoney1CateCount;
							totalInMoney2 += productInMoney2CateCount;
							totalAllInMoney += productInMoney3CateCount;
							totalOutMoney1 += productOutMoney1CateCount;
							totalOutMoney2 += productOutMoney2CateCount;
							totalAllOutMoney += productOutMoney3CateCount;
							totalMoney += allMoneyCateCount;
							index++;
						}
					}
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 0);
					HSSFCell cell_1 = tRow.createCell((short) 1);
					HSSFCell cell_2 = tRow.createCell((short) 2);
					HSSFCell cell_3 = tRow.createCell((short) 3);
					HSSFCell cell_4 = tRow.createCell((short) 4);
					HSSFCell cell_5 = tRow.createCell((short) 5);
					HSSFCell cell_6 = tRow.createCell((short) 6);
					HSSFCell cell_7 = tRow.createCell((short) 7);
					HSSFCell cell_8 = tRow.createCell((short) 8);

					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);

					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);

					zongjiCell.setCellValue("合计：");
					cell_1.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthMoney)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney1)));
					cell_3.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney2)));
					cell_4.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllInMoney)));
					cell_5.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney1)));
					cell_6.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney2)));
					cell_7.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllOutMoney)));
					cell_8.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMoney)));

				}
			}
			fileName = fileName + ".xls";
			response.setHeader("Cache-Control", "No-cache");
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
			response.setDateHeader("Expires", 0);
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();

			tWb.write(out);

			out.flush();
			out.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception ex1) {

			}
		}
	}

	private void writeExcel_ReportPCMoneyInout(List vec, String month,
			String warehouseCode, String fileName, String start, String end,
			HttpServletRequest request, HttpServletResponse response) {
		DBConnection con = null;
		ServletOutputStream out = null;
		boolean parent = false;
		/* 循环形参vec 结构<List>(1:String[2],2.3.4...:String[15]) */
		int size;
		if (vec == null) {
			size = 0;
		} else {
			size = vec.size();
		}
		HSSFWorkbook tWb = new HSSFWorkbook();
		HSSFSheet tSheet = null;
		try {
			for (int k = 0; k < size; k++) {
				List list = (List) vec.get(k);
				String[] warehouseObject = (String[]) list.get(0);
				String name = warehouseObject[1] + "(" + warehouseObject[0]
						+ ")";
				tSheet = tWb.createSheet();
				HSSFRow tRow = null;
				Region region = null;
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				tSheet.setColumnWidth((short) 5, (short) (10 * 256));
				tSheet.setColumnWidth((short) 6, (short) (10 * 256));
				tSheet.setColumnWidth((short) 7, (short) (10 * 256));
				tSheet.setColumnWidth((short) 8, (short) (12 * 256));
				tSheet.setColumnWidth((short) 9, (short) (14 * 256));
				tSheet.setColumnWidth((short) 10, (short) (14 * 256));
				tSheet.setColumnWidth((short) 11, (short) (14 * 256));
				tSheet.setColumnWidth((short) 12, (short) (14 * 256));
				tSheet.setColumnWidth((short) 13, (short) (14 * 256));
				tWb.setSheetName(k, name, HSSFCell.ENCODING_UTF_16);
				HSSFFont font = tWb.createFont();
				font.setFontHeightInPoints((short) 9);
				font.setFontName("宋体");
				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				HSSFCellStyle cStyle = tWb.createCellStyle();
				cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				HSSFCellStyle cStyleM = tWb.createCellStyle();
				cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
				cStyleM.setFont(font);

				HSSFCellStyle cStyleM_R = tWb.createCellStyle();
				cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				cStyleM_R.setFont(font);
				// 标题行
				tRow = tSheet.createRow((short) 0);
				HSSFCell c0 = createCell(tWb, tRow, (short) 4, name
						+ "仓库产品资金进出累计汇总(集团分类)");
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 4, 1, (short) 8);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 4, "统计日期:" + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
				// 表头行
				tRow = tSheet.createRow((short) 2);
				HSSFCell c1 = createCell(tWb, tRow, (short) 0, "产品类别");
				HSSFCell c2 = createCell(tWb, tRow, (short) 1, "期初金额");
				HSSFCell c3 = createCell(tWb, tRow, (short) 2, "购入");
				HSSFCell c4 = createCell(tWb, tRow, (short) 3, "盘盈");
				HSSFCell c5 = createCell(tWb, tRow, (short) 4, "入库合计");
				HSSFCell c6 = createCell(tWb, tRow, (short) 5, "领用");
				HSSFCell c7 = createCell(tWb, tRow, (short) 6, "盘亏");
				HSSFCell c8 = createCell(tWb, tRow, (short) 7, "出库合计");
				HSSFCell c9 = createCell(tWb, tRow, (short) 8, "结存");
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				short index = 2; // 当前所在行号

				/** 总信息 */
				double totalMonthMoney = 0;
				double totalInMoney1 = 0;
				double totalInMoney2 = 0;
				double totalAllInMoney = 0;
				double totalOutMoney1 = 0;
				double totalOutMoney2 = 0;
				double totalAllOutMoney = 0;
				double totalMoney = 0;

				con = DBConnection.open(false);
				List newVec = splitWarehouseCategory(list);
				// 缺少为空验证
				int sizeAll = newVec.size();
				// 总集合
				for (int i = 0; i < sizeAll; i++) {
					List subVec = (List) newVec.get(i);
					int sizeSub = subVec.size();
					// 子类集合
					ProductCategory wc = null;

					/** 小记信息 */
					double monthMoneyCateCount = 0;
					double productInMoney1CateCount = 0;
					double productInMoney2CateCount = 0;
					double productInMoney3CateCount = 0;
					double productOutMoney1CateCount = 0;
					double productOutMoney2CateCount = 0;
					double productOutMoney3CateCount = 0;
					double allMoneyCateCount = 0;

					for (int j = 0; j < sizeSub; j++) {

						/** 行信息 */
						double monthMoney = 0;
						double productInMoney1 = 0;
						double productInMoney2 = 0;
						double productInMoney3 = 0;
						double productOutMoney1 = 0;
						double productOutMoney2 = 0;
						double productOutMoney3 = 0;
						double allMoney = 0;
						// 缺少为空验证
						// 单一行
						String[] values = (String[]) subVec.get(j);
						if (j == 0) {
							if (values[13].equals("0") || values[13].equals("")) {
								parent = false;
							} else {
								wc = ProductCategory.fetchByCode(con,
										values[13]);
								parent = true;
							}
						}
						monthMoney = Double.parseDouble(values[2]);
						productInMoney1 = Double.parseDouble(values[4]);
						productInMoney2 = Double.parseDouble(values[5]);
						productInMoney3 = Double.parseDouble(values[6]);
						productOutMoney1 = Double.parseDouble(values[8]);
						productOutMoney2 = Double.parseDouble(values[9]);
						productOutMoney3 = Double.parseDouble(values[10]);
						allMoney = Double.parseDouble(values[12]);

						tRow = tSheet.createRow((short) (index + 1));
						createCell(tWb, tRow, (short) 0, values[14]);
						createCell(tWb, tRow, (short) 1, StringUtil
								.showPrice(String.valueOf(monthMoney)));
						createCell(tWb, tRow, (short) 2, StringUtil
								.showPrice(String.valueOf(productInMoney1)));
						createCell(tWb, tRow, (short) 3, StringUtil
								.showPrice(String.valueOf(productInMoney2)));
						createCell(tWb, tRow, (short) 4, StringUtil
								.showPrice(String.valueOf(productInMoney3)));
						createCell(tWb, tRow, (short) 5, StringUtil
								.showPrice(String.valueOf(productOutMoney1)));
						createCell(tWb, tRow, (short) 6, StringUtil
								.showPrice(String.valueOf(productOutMoney2)));
						createCell(tWb, tRow, (short) 7, StringUtil
								.showPrice(String.valueOf(productOutMoney3)));
						createCell(tWb, tRow, (short) 8, StringUtil
								.showPrice(String.valueOf(allMoney)));

						monthMoneyCateCount += monthMoney;
						productInMoney1CateCount += productInMoney1;
						productInMoney2CateCount += productInMoney2;
						productInMoney3CateCount += productInMoney3;
						productOutMoney1CateCount += productOutMoney1;
						productOutMoney2CateCount += productOutMoney2;
						productOutMoney3CateCount += productOutMoney3;
						allMoneyCateCount += allMoney;

						index++;
						if (j + 1 == sizeSub) {
							tRow = tSheet.createRow((short) (index + 1));
							if (parent == true) {
								HSSFCell zongjiCell = tRow
										.createCell((short) 0);
								HSSFCell cell_1 = tRow.createCell((short) 1);
								HSSFCell cell_2 = tRow.createCell((short) 2);
								HSSFCell cell_3 = tRow.createCell((short) 3);
								HSSFCell cell_4 = tRow.createCell((short) 4);
								HSSFCell cell_5 = tRow.createCell((short) 5);
								HSSFCell cell_6 = tRow.createCell((short) 6);
								HSSFCell cell_7 = tRow.createCell((short) 7);
								HSSFCell cell_8 = tRow.createCell((short) 8);

								zongjiCell.setCellStyle(cStyleM_R);
								cell_1.setCellStyle(cStyleM_R);
								cell_2.setCellStyle(cStyleM_R);
								cell_3.setCellStyle(cStyleM_R);
								cell_4.setCellStyle(cStyleM_R);
								cell_5.setCellStyle(cStyleM_R);
								cell_6.setCellStyle(cStyleM_R);
								cell_7.setCellStyle(cStyleM_R);
								cell_8.setCellStyle(cStyleM_R);

								zongjiCell
										.setEncoding(HSSFCell.ENCODING_UTF_16);

								zongjiCell.setCellValue(wc.getName()
										+ "    小计:");
								cell_1.setCellValue(StringUtil.showPrice(String
										.valueOf(monthMoneyCateCount)));
								cell_2.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney1CateCount)));
								cell_3.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney2CateCount)));
								cell_4.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney3CateCount)));
								cell_5.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney1CateCount)));
								cell_6.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney2CateCount)));
								cell_7.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney3CateCount)));
								cell_8.setCellValue(StringUtil.showPrice(String
										.valueOf(allMoneyCateCount)));
							}
							totalMonthMoney += monthMoneyCateCount;
							totalInMoney1 += productInMoney1CateCount;
							totalInMoney2 += productInMoney2CateCount;
							totalAllInMoney += productInMoney3CateCount;
							totalOutMoney1 += productOutMoney1CateCount;
							totalOutMoney2 += productOutMoney2CateCount;
							totalAllOutMoney += productOutMoney3CateCount;
							totalMoney += allMoneyCateCount;
							index++;
						}
					}
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 0);
					HSSFCell cell_1 = tRow.createCell((short) 1);
					HSSFCell cell_2 = tRow.createCell((short) 2);
					HSSFCell cell_3 = tRow.createCell((short) 3);
					HSSFCell cell_4 = tRow.createCell((short) 4);
					HSSFCell cell_5 = tRow.createCell((short) 5);
					HSSFCell cell_6 = tRow.createCell((short) 6);
					HSSFCell cell_7 = tRow.createCell((short) 7);
					HSSFCell cell_8 = tRow.createCell((short) 8);

					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);

					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);

					zongjiCell.setCellValue("合计：");
					cell_1.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthMoney)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney1)));
					cell_3.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney2)));
					cell_4.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllInMoney)));
					cell_5.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney1)));
					cell_6.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney2)));
					cell_7.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllOutMoney)));
					cell_8.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMoney)));

				}
			}
			fileName = fileName + ".xls";
			response.setHeader("Cache-Control", "No-cache");
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
			response.setDateHeader("Expires", 0);
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();

			tWb.write(out);

			out.flush();
			out.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception ex1) {

			}
		}
	}

	/** 将总集合分割 以Warehouse_category_code为分隔条件 */
	private List splitWarehouseCategory(List vec) {
		if (vec == null || vec.size() == 0) {
			return null;
		}
		int allSize = vec.size();
		List newVec = new ArrayList();
		List splitVec = new ArrayList();
		boolean needNew = false;
		for (int i = 1; i < allSize; i++) {
			if (needNew) {
				splitVec = new Vector();
				needNew = false;
			}
			String[] values1 = (String[]) vec.get(i);
			String[] values2 = null;
			if (allSize != i + 1) {
				values2 = (String[]) vec.get(i + 1);
				String parentCode1 = values1[13];
				String parentCode2 = values2[13];
				splitVec.add(values1);
				if (!parentCode1.equals(parentCode2)) {
					// 告知创建新的集合
					needNew = true;
					newVec.add(splitVec);
				}
			} else {
				splitVec.add(values1);
				newVec.add(splitVec);
			}
		}
		return newVec;
	}
	
	/** 将总集合分割 以product_type为分隔条件 */
	private List splitProductType(List vec) {
		if (vec == null || vec.size() == 0) {
			return null;
		}
		int allSize = vec.size();
		List newVec = new ArrayList();
		List splitVec = new ArrayList();
		boolean needNew = false;
		for (int i = 1; i < allSize; i++) {
			if (needNew) {
				splitVec = new Vector();
				needNew = false;
			}
			String[] values1 = (String[]) vec.get(i);
			String[] values2 = null;
			if (allSize != i + 1) {
				splitVec.add(values1);

			} else {
				splitVec.add(values1);
				newVec.add(splitVec);
			}
		}
		return newVec;
	}

	/**
	 * 空调报表
	 */
	public void writeExcel_ReportAirSort(Map map, String sheetName,
			String month, String title, String warehouseCode, String fileName,
			String start, String end, HttpServletRequest request,
			HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			HSSFWorkbook tWb = new HSSFWorkbook();
			AirSortReportExcel excel = new AirSortReportExcel();
			excel.writeExcel_ReportAirSort(map, sheetName, month, title,
					warehouseCode, fileName, start, end, tWb);
			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}


	public Vector detailqueryProviderRepairWithOutBalance_mode(
			String warehouseCode, String start, String end,
			String providerName, boolean needall) {
		boolean provider = !providerName.equals("") && providerName != null;// 供应商是否存在
		String providertrue = "select code,name from t_provider where name = '"
				+ providerName + "'";
		String sqlStart = " select a.code,(select name from t_provider where t_provider.code = a.code) name from( ";
		String sqlInStart = " select " + " inhead.provider_code code, "
				+ " inhead.provider_name name " + " from "
				+ " t_in_head inhead, " + " t_in_sub insub " + " where "
				+ " inhead.in_bill_code = insub.in_bill_code " + " and "
				+ " inhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and " + " insub.status = '1' ";
		String sqlInEnd = " group by inhead.provider_code,inhead.provider_name ";
		String inneedallfalse = " and inhead.in_time >= '" + start + "' "
				+ " and " + " inhead.in_time <= '" + end + "' ";
		String sqlMonthStorage = "select per.code code,per.NAME"
            	+ " from t_month_storage mstorage,t_provider per,t_product_type wcr "
            	+ " where mstorage.PROVIDER_CODE = per.CODE and mstorage.product_id=wcr.product_id and wcr.type=11 and mstorage.STATUS = 1"
                + " and mstorage.WAREHOUSE_CODE LIKE '"+ warehouseCode +"%'";
        String sqlMonthEnd = " group by per.code,per.NAME";
       
		int superMonth = Integer.parseInt(start.substring(5, 7)) - 1;
		int year = Integer.parseInt(start.substring(0, 4));
		if (superMonth == 0) {
			superMonth = 12;
			year = year - 1;
		}
		String dataMonth = "" + year + "-"
		+ (superMonth > 9 ? "" + superMonth : "0" + superMonth);
        String monthneedalltrue = " and mstorage.MONTH = '"+dataMonth+"'";
		String sqlEnd = " ) a group by code order by code ";
		String sql = "";
		String sqlOutStart = " select " + " per.code code, "
				+ " per.name name " + " from " + " t_out_head outhead, "
				+ " t_out_sub outsub, " + " t_provider per " + " where "
				+ " outhead.out_bill_code = outsub.out_bill_code " + " and "
				+ " outhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and " + " outsub.status = '1' " + " and "
				+ " per.code = outsub.provider_code ";

		String sqlOutEnd = " group by per.code,per.name ";
		String outneedallfalse = " and outhead.out_time >= '" + start
				+ "' and outhead.out_time <= '" + end + "' ";
		
		if (needall) {// 需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart +inneedallfalse+ sqlInEnd + " union all "
						+ sqlMonthStorage + monthneedalltrue + sqlMonthEnd + sqlEnd;
			}
		} else {// 不需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart + inneedallfalse + sqlInEnd
						+ " union all " + sqlOutStart + outneedallfalse
						+ sqlOutEnd + sqlEnd;
			}
		}
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		DBResult dbrs = null;
		ResultSet row = null;
		Vector vec = new Vector();
		try {
			dbrs = DBEngine.doSelect(con, sql);
			row = dbrs.getRs();
			while (row.next()) {
				ProviderTemp pt = new ProviderTemp();
				pt.providerCode = row.getString(1);
				pt.ProviderName = row.getString(2);
				vec.add(pt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				row.close();
				dbrs.clear();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return vec;
	}
	
	/**
	 * 报表18调用 根据起始时间 得到入库单纪录中 符合条件的供应商列表
	 */
	public Vector detailqueryProviderGroupWithOutBalance_mode(
			String warehouseCode, String start, String end,
			String providerName, boolean needall) {
		boolean provider = !providerName.equals("") && providerName != null;// 供应商是否存在
		String providertrue = "select code,name from t_provider where name = '"
				+ providerName + "'";
		String sqlStart = " select a.code,(select name from t_provider where t_provider.code = a.code) name from( ";
		String sqlInStart = " select " + " inhead.provider_code code, "
				+ " inhead.provider_name name " + " from "
				+ " t_in_head inhead, " + " t_in_sub insub " + " where "
				+ " inhead.in_bill_code = insub.in_bill_code " + " and "
				+ " inhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and " + " insub.status = '1' ";
		String sqlInEnd = " group by inhead.provider_code,inhead.provider_name ";
		String inneedallfalse = " and inhead.in_time >= '" + start + "' "
				+ " and " + " inhead.in_time <= '" + end + "' ";
		String sqlMonthStorage = "select per.code code,per.NAME"
            	+ " from t_month_storage mstorage,t_provider per"
            	+ " where mstorage.PROVIDER_CODE = per.CODE and mstorage.STATUS = 1"
                + " and mstorage.WAREHOUSE_CODE LIKE '"+ warehouseCode +"%'";
        String sqlMonthEnd = " group by per.code,per.NAME";
       
		int superMonth = Integer.parseInt(start.substring(5, 7)) - 1;
		int year = Integer.parseInt(start.substring(0, 4));
		if (superMonth == 0) {
			superMonth = 12;
			year = year - 1;
		}
		String dataMonth = "" + year + "-"
		+ (superMonth > 9 ? "" + superMonth : "0" + superMonth);
        String monthneedalltrue = " and mstorage.MONTH = '"+dataMonth+"'";
		String sqlEnd = " ) a group by code order by code ";
		String sql = "";
		String sqlOutStart = " select " + " per.code code, "
				+ " per.name name " + " from " + " t_out_head outhead, "
				+ " t_out_sub outsub, " + " t_provider per " + " where "
				+ " outhead.out_bill_code = outsub.out_bill_code " + " and "
				+ " outhead.warehouse_code like '" + warehouseCode + "%' "
				+ " and " + " outsub.status = '1' " + " and "
				+ " per.code = outsub.provider_code ";

		String sqlOutEnd = " group by per.code,per.name ";
		String outneedallfalse = " and outhead.out_time >= '" + start
				+ "' and outhead.out_time <= '" + end + "' ";
		
		if (needall) {// 需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart +inneedallfalse+ sqlInEnd + " union all "
						+ sqlMonthStorage + monthneedalltrue + sqlMonthEnd + sqlEnd;
			}
		} else {// 不需要所有数据
			if (provider) {
				sql = providertrue;
			} else {
				sql = sqlStart + sqlInStart + inneedallfalse + sqlInEnd
						+ " union all " + sqlOutStart + outneedallfalse
						+ sqlOutEnd + sqlEnd;
			}
		}
		DBConnection con = null;
		try {
			con = DBConnection.open(false);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		DBResult dbrs = null;
		ResultSet row = null;
		Vector vec = new Vector();
		try {
			dbrs = DBEngine.doSelect(con, sql);
			row = dbrs.getRs();
			while (row.next()) {
				ProviderTemp pt = new ProviderTemp();
				pt.providerCode = row.getString(1);
				pt.ProviderName = row.getString(2);
				vec.add(pt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				row.close();
				dbrs.clear();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return vec;
	}

	private boolean isProcessContinue(HttpServletRequest request,
			HttpServletResponse response) {
		String action = request.getParameter("action");

		if (IS_REPORT_PROCESSING.equalsIgnoreCase(action)) {
			String val = request.getParameter("val");
			HttpSession session = request.getSession();
			Boolean isReportProcessing = (Boolean) session
					.getAttribute(IS_REPORT_PROCESSING);
			if (isReportProcessing == null) {
				isReportProcessing = Boolean.FALSE;
			}
			String jsonString = "{result:" + isReportProcessing.booleanValue()
					+ ",val:" + val + "}";
			ResponseUtils.renderJson(response, jsonString);
			return false;
		} else {
			return true;
		}
	}

	private void errorMessage(HttpServletRequest request,
			HttpServletResponse response, String title, String message)
			throws ServletException {
		try {
			String path = "";
			if ("1".equals(title)) {
				path = "/system/report/ReportProductMS.jsp";
			} else if ("2".equals(title)) {
				path = "/system/report/ReportCustomer.jsp";
			} else if ("3".equals(title)) {
				path = "/system/report/ReportYKProductMonthNew.jsp";
			} else if ("4".equals(title)) {
				path = "/system/report/ReportYKMoneyMonth.jsp";
			} else if ("5".equals(title)) {
				path = "/system/report/ReportMDMoneyInout.jsp";
			} else if ("6".equals(title)) {
				path = "/system/report/ReportCustomerInList.jsp";
			} else if ("7".equals(title)) {
				path = "/system/report/ReportYKProductMonthList.jsp";
			} else if ("8".equals(title)) {
				path = "/system/report/ReportMDWCMoneyInout.jsp";
			} else if ("9".equals(title)) {
				path = "/system/report/ReportYKProductNew.jsp";
			} else if ("10".equals(title)) {
				path = "/system/report/ReportProductMS.jsp";
			} else if ("11".equals(title)) {
				path = "/system/report/ReportMDMoneyInoutNew.jsp";
			} else if ("12".equals(title)) {
				path = "/system/report/ReportYKProductMonthListNew.jsp";
			} else if ("13".equals(title)) {
				path = "/system/report/ReportCustomerMS.jsp";
			} else if ("14".equals(title)) {
				path = "/system/report/ReportAllWarehouseMoneyMonthSum.jsp";
			} else if ("16".equals(title)) {
				path = "/system/report/ReportAirProduct.jsp";
			} else if ("17".equals(title)) {
				path = "/system/report/ReportCustomerMS.jsp";
			} else if ("18".equals(title)) {
				path = "/system/report/ReportYKProductNew.jsp";
			}else if ("19".equals(title)) {
				path = "/system/report/ReportProviderProductType.jsp";
			}else if ("20".equals(title)) {
				path = "/system/report/ReportProviderProductTypeAll.jsp";
			}else if ("21".equals(title)) {
				path = "/system/report/ReportProductRepair.jsp";
			}else if ("22".equals(title)||"23".equals(title)) {
				path = "/system/report/ReportRepair.jsp";
			}

			request.getSession().setAttribute("MSG", message);
			getServletConfig().getServletContext().getRequestDispatcher(path)
					.forward(request, response);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void isMonthStorage(HttpServletRequest request,
			HttpServletResponse response, String title, String dataMonth)
			throws ServletException {

		String message = dataMonth.substring(0, 4) + "年"
				+ dataMonth.substring(5, 7) + "月，没有月结，请月结后查看报表";
		errorMessage(request, response, title, message);
	}
	
	/** EXCEL 处理 报表18*/
	private void writeExcel_ReportYKProductAll(String month, String title, String fileName, Vector vec, String title1, String start, String end,
			String warehouseCode, HttpServletRequest request, HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			/** 创建通用EXCEL 开始 */
			HSSFWorkbook tWb = new HSSFWorkbook();
			Region region = null;
			HSSFSheet tSheet = null;
			HSSFRow tRow = null;
			HSSFCell c0 = null;
			HSSFCell c1 = null;
			HSSFCell c2 = null;
			HSSFCell c3 = null;
			HSSFCell c4 = null;
			HSSFCell c5 = null;
			HSSFCell c6 = null;
			HSSFCell c7 = null;
			HSSFCell c8 = null;
			HSSFCell c9 = null;
			HSSFCell c10 = null;
			HSSFCell c11 = null;
			HSSFCell c12 = null;
			HSSFCell c13 = null;
			HSSFCell c14 = null;
			HSSFCell c15 = null;
			HSSFCell c16 = null;
			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);
			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);
			/** 创建通用EXCEL 结束 */

			
			/** 创建Sheet 开始 */
			tSheet = tWb.createSheet();
			
			tWb.setSheetName(0, "仓库产品进、销、存供应商分类报表", HSSFCell.ENCODING_UTF_16);
			tSheet.setColumnWidth((short) 0, (short) (16 * 256));
			tSheet.setColumnWidth((short) 1, (short) (12 * 256));
			tSheet.setColumnWidth((short) 2, (short) (12 * 256));
			tSheet.setColumnWidth((short) 3, (short) (18 * 256));
			tSheet.setColumnWidth((short) 4, (short) (10 * 256));
			tSheet.setColumnWidth((short) 5, (short) (10 * 256));
			tSheet.setColumnWidth((short) 6, (short) (10 * 256));
			tSheet.setColumnWidth((short) 7, (short) (10 * 256));
			tSheet.setColumnWidth((short) 8, (short) (10 * 256));
			tSheet.setColumnWidth((short) 9, (short) (12 * 256));
			tSheet.setColumnWidth((short) 10, (short) (14 * 256));
			tSheet.setColumnWidth((short) 11, (short) (14 * 256));
			tSheet.setColumnWidth((short) 12, (short) (14 * 256));
			tSheet.setColumnWidth((short) 13, (short) (14 * 256));
			tSheet.setColumnWidth((short) 14, (short) (14 * 256));
			tSheet.setColumnWidth((short) 15, (short) (14 * 256));
			tSheet.setColumnWidth((short) 16, (short) (14 * 256));//供应商
			
			// 标题行
			tRow = tSheet.createRow((short) 0);
			c0 = createCell(tWb, tRow, (short) 5, title1);
			c0.setCellStyle(cStyleM);
			// 日期行
			tRow = tSheet.createRow((short) 1);
			region = new Region(1, (short) 9, 1, (short) 13);
			tSheet.addMergedRegion(region);
			createCell(tWb, tRow, (short) 9, "               " + start + " 至 " + end, HSSFCellStyle.ALIGN_CENTER, false);

			// 表头行
			tRow = tSheet.createRow((short) 2);
			c1 = createCell(tWb, tRow, (short) 0, "产品编码");
			c2 = createCell(tWb, tRow, (short) 1, "自编码");
			c3 = createCell(tWb, tRow, (short) 2, "产品名称");
			c4 = createCell(tWb, tRow, (short) 3, "规格");
			c5 = createCell(tWb, tRow, (short) 4, "型号");
			c6 = createCell(tWb, tRow, (short) 5, "品牌");
			c7 = createCell(tWb, tRow, (short) 6, "单位");
			c8 = createCell(tWb, tRow, (short) 7, "单价");
			c9 = createCell(tWb, tRow, (short) 8, "期初数量");
			c10 = createCell(tWb, tRow, (short) 9, "期初金额");
			c11 = createCell(tWb, tRow, (short) 10, "入库数量");
			c12 = createCell(tWb, tRow, (short) 11, "入库金额");
			c13 = createCell(tWb, tRow, (short) 12, "领出数量");
			c14 = createCell(tWb, tRow, (short) 13, "领出金额");
			c15 = createCell(tWb, tRow, (short) 14, "期末数量");
			c0 = createCell(tWb, tRow, (short) 15, "期末金额");
			c16 = createCell(tWb, tRow, (short) 16, "供应商");
			c1.setCellStyle(cStyleM_R);
			c2.setCellStyle(cStyleM_R);
			c3.setCellStyle(cStyleM_R);
			c4.setCellStyle(cStyleM_R);
			c5.setCellStyle(cStyleM_R);
			c6.setCellStyle(cStyleM_R);
			c7.setCellStyle(cStyleM_R);
			c8.setCellStyle(cStyleM_R);
			c9.setCellStyle(cStyleM_R);
			c10.setCellStyle(cStyleM_R);
			c11.setCellStyle(cStyleM_R);
			c12.setCellStyle(cStyleM_R);
			c13.setCellStyle(cStyleM_R);
			c14.setCellStyle(cStyleM_R);
			c15.setCellStyle(cStyleM_R);
			c0.setCellStyle(cStyleM_R);
			c16.setCellStyle(cStyleM_R);
			short index = 2;
			double totalMonthStorageMoney = 0;
			double totalMonthStorageCount = 0;
			double totalInCount = 0;
			double totalInMoney = 0;
			double totalOutCount = 0;
			double totalOutMoney = 0;
			double totalMonthEndCount = 0;
			double totalMonthEndMoney = 0;
			for (int k = 0; k < vec.size(); k++) {
				Vector vec1 = (Vector) vec.get(k);
				String productCode = "";
				String productName = "";
				String spec = "";
				String model = "";
				String brand = "";
				String unit = "";
				String productApepCode = "";
				ProviderTemp pt = (ProviderTemp) vec1.get(0);
				
				// 期初计算
				for (int i = 1; i < vec1.size(); i++) {
					String[] values = (String[]) vec1.get(i);
					double productMonthMoney = 0;
					double productMonthCount = 0;
					double productInCount = 0;
					double productInMoney = 0;
					double productOutCount = 0;
					double productOutMoney = 0;
					double monthEndCount = 0;
					double monthEndMoney = 0;
					productMonthCount = Double.parseDouble(values[1]);
					productMonthMoney = Double.parseDouble(values[2]);

					productInCount = Double.parseDouble(values[3]);
					productInMoney = Double.parseDouble(values[4]);

					productOutCount = Double.parseDouble(values[5]);
					productOutMoney = Double.parseDouble(values[6]);

					monthEndCount = Double.parseDouble(values[7]);
					monthEndMoney = Double.parseDouble(values[8]);
					// 創建一行
					tRow = tSheet.createRow((short) (index + 1));
					createCell(tWb, tRow, (short) 0, values[0]);
					createCell(tWb, tRow, (short) 1, values[9] == null ? "" : values[9]);
					createCell(tWb, tRow, (short) 2, values[10] == null ? "" : values[10]);
					createCell(tWb, tRow, (short) 3, values[11] == null ? "" : values[11]);
					createCell(tWb, tRow, (short) 4, values[12] == null ? "" : values[12]);
					createCell(tWb, tRow, (short) 5, values[13] == null ? "" : values[13]);
					createCell(tWb, tRow, (short) 6, values[14] == null ? "" : values[14]);
					createCell(tWb, tRow, (short) 7, StringUtil.showCount(values[15]));
					createCell(tWb, tRow, (short) 8, StringUtil.showCount(String.valueOf(productMonthCount)));
					createCell(tWb, tRow, (short) 9, StringUtil.showPrice(String.valueOf(productMonthMoney)));
					createCell(tWb, tRow, (short) 10, StringUtil.showCount(String.valueOf(productInCount)));
					createCell(tWb, tRow, (short) 11, StringUtil.showPrice(String.valueOf(productInMoney)));
					createCell(tWb, tRow, (short) 12, StringUtil.showCount(String.valueOf(productOutCount)));
					createCell(tWb, tRow, (short) 13, StringUtil.showPrice(String.valueOf(productOutMoney)));
					createCell(tWb, tRow, (short) 14, StringUtil.showCount(String.valueOf(monthEndCount)));
					createCell(tWb, tRow, (short) 15, StringUtil.showPrice(String.valueOf(monthEndMoney)));
					createCell(tWb, tRow, (short) 16, pt.ProviderName==null?"":pt.ProviderName);
					totalInCount += productInCount;
					totalInMoney += productInMoney;
					totalOutCount += productOutCount;
					totalOutMoney += productOutMoney;
					totalMonthStorageCount += productMonthCount;
					totalMonthStorageMoney += productMonthMoney;
					totalMonthEndCount += monthEndCount;
					totalMonthEndMoney += monthEndMoney;
					index++;
				}
				
			}
			
			// 总计行
			if (index > 2) {
				tRow = tSheet.createRow((short) (index + 2));
				HSSFCell zongjiCell = tRow.createCell((short) 5);
				HSSFCell cell_1 = tRow.createCell((short) 8);
				HSSFCell cell_2 = tRow.createCell((short) 9);
				HSSFCell cell_3 = tRow.createCell((short) 10);
				HSSFCell cell_4 = tRow.createCell((short) 11);
				HSSFCell cell_5 = tRow.createCell((short) 12);
				HSSFCell cell_6 = tRow.createCell((short) 13);
				HSSFCell cell_7 = tRow.createCell((short) 14);
				HSSFCell cell_8 = tRow.createCell((short) 15);
				zongjiCell.setCellStyle(cStyleM_R);
				cell_1.setCellStyle(cStyleM_R);
				cell_2.setCellStyle(cStyleM_R);
				cell_3.setCellStyle(cStyleM_R);
				cell_4.setCellStyle(cStyleM_R);
				cell_5.setCellStyle(cStyleM_R);
				cell_6.setCellStyle(cStyleM_R);
				cell_7.setCellStyle(cStyleM_R);
				cell_8.setCellStyle(cStyleM_R);
				zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
				zongjiCell.setCellValue("合计:");
				cell_1.setCellValue(StringUtil.showCount(String.valueOf(totalMonthStorageCount)));
				cell_2.setCellValue(StringUtil.showPrice(String.valueOf(totalMonthStorageMoney)));
				cell_3.setCellValue(StringUtil.showCount(String.valueOf(totalInCount)));
				cell_4.setCellValue(StringUtil.showPrice(String.valueOf(totalInMoney)));
				cell_5.setCellValue(StringUtil.showCount(String.valueOf(totalOutCount)));
				cell_6.setCellValue(StringUtil.showPrice(String.valueOf(totalOutMoney)));
				cell_7.setCellValue(StringUtil.showCount(String.valueOf(totalMonthEndCount)));
				cell_8.setCellValue(StringUtil.showPrice(String.valueOf(totalMonthEndMoney)));
			}
			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}
	
	/** EXCEL 处理 报表19*/
	private void writeExcel_ProviderproductType(String month, String title, String fileName, Vector vec, String title1, String start, String end,
			String warehouseCode, HttpServletRequest request, HttpServletResponse response) {
		ServletOutputStream out = null;
		try {
			//TODO
			/** 创建通用EXCEL 开始 */
			HSSFWorkbook tWb = new HSSFWorkbook();
			Region region = null;
			HSSFSheet tSheet = null;
			HSSFRow tRow = null;
			HSSFCell c0 = null;
			HSSFCell c1 = null;
			HSSFCell c2 = null;
			HSSFCell c3 = null;
			HSSFCell c4 = null;
			HSSFCell c5 = null;
			HSSFCell c6 = null;
			HSSFCell c7 = null;
			HSSFCell c8 = null;
			HSSFCell c9 = null;
			HSSFCell c10 = null;
			HSSFCell c11 = null;
			HSSFCell c12 = null;
			HSSFCell c13 = null;
			HSSFCell c14 = null;
			HSSFCell c15 = null;
			HSSFCell c16 = null;
			HSSFFont font = tWb.createFont();
			font.setFontHeightInPoints((short) 9);
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle cStyle = tWb.createCellStyle();
			cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			HSSFCellStyle cStyleM = tWb.createCellStyle();
			cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cStyleM.setFont(font);
			HSSFCellStyle cStyleM_R = tWb.createCellStyle();
			cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
			cStyleM_R.setFont(font);
			
			for(int j = 0;j<4;j++){
				
				tSheet = tWb.createSheet();
				String sheetname = "";
				if(j==0){
					sheetname = "I类";
				}else if(j==1){
					sheetname = "II类";
				}else if(j==2){
					sheetname = "III类";
				}else{
					sheetname = "IV类";
				}
				tWb.setSheetName(j, sheetname, HSSFCell.ENCODING_UTF_16);
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				tSheet.setColumnWidth((short) 5, (short) (10 * 256));
				tSheet.setColumnWidth((short) 6, (short) (10 * 256));
				tSheet.setColumnWidth((short) 7, (short) (10 * 256));
				tSheet.setColumnWidth((short) 8, (short) (10 * 256));
				tSheet.setColumnWidth((short) 9, (short) (12 * 256));
				tSheet.setColumnWidth((short) 10, (short) (14 * 256));
				tSheet.setColumnWidth((short) 11, (short) (14 * 256));
				tSheet.setColumnWidth((short) 12, (short) (14 * 256));
				tSheet.setColumnWidth((short) 13, (short) (14 * 256));
				tSheet.setColumnWidth((short) 14, (short) (14 * 256));
				tSheet.setColumnWidth((short) 15, (short) (14 * 256));
				tSheet.setColumnWidth((short) 16, (short) (14 * 256));//供应商
				tSheet.setColumnWidth((short)17, (short) (14 * 256));//供应商结算分类
				// 标题行
				tRow = tSheet.createRow((short) 0);
				c0 = createCell(tWb, tRow, (short) 5, title1);
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 9, 1, (short) 13);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 9, "               " + start + " 至 " + end, HSSFCellStyle.ALIGN_CENTER, false);

				// 表头行
				tRow = tSheet.createRow((short) 2);
				c1 = createCell(tWb, tRow, (short) 0, "产品编码");
				c2 = createCell(tWb, tRow, (short) 1, "自编码");
				c3 = createCell(tWb, tRow, (short) 2, "产品名称");
				c4 = createCell(tWb, tRow, (short) 3, "规格");
				c5 = createCell(tWb, tRow, (short) 4, "型号");
				c6 = createCell(tWb, tRow, (short) 5, "品牌");
				c7 = createCell(tWb, tRow, (short) 6, "单位");
				c8 = createCell(tWb, tRow, (short) 7, "单价");
				c9 = createCell(tWb, tRow, (short) 8, "期初数量");
				c10 = createCell(tWb, tRow, (short) 9, "期初金额");
				c11 = createCell(tWb, tRow, (short) 10, "入库数量");
				c12 = createCell(tWb, tRow, (short) 11, "入库金额");
				c13 = createCell(tWb, tRow, (short) 12, "领出数量");
				c14 = createCell(tWb, tRow, (short) 13, "领出金额");
				c15 = createCell(tWb, tRow, (short) 14, "期末数量");
				c0 = createCell(tWb, tRow, (short) 15, "期末金额");
				c16 = createCell(tWb, tRow, (short) 16, "供应商");
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				c10.setCellStyle(cStyleM_R);
				c11.setCellStyle(cStyleM_R);
				c12.setCellStyle(cStyleM_R);
				c13.setCellStyle(cStyleM_R);
				c14.setCellStyle(cStyleM_R);
				c15.setCellStyle(cStyleM_R);
				c0.setCellStyle(cStyleM_R);
				c16.setCellStyle(cStyleM_R);
				short index = 2;
				double totalMonthStorageMoney = 0;
				double totalMonthStorageCount = 0;
				double totalInCount = 0;
				double totalInMoney = 0;
				double totalOutCount = 0;
				double totalOutMoney = 0;
				double totalMonthEndCount = 0;
				double totalMonthEndMoney = 0;
				for (int k = 0; k < vec.size(); k++) {
					Vector vec1 = (Vector) vec.get(k);
					ProviderTemp pt = (ProviderTemp) vec1.get(0);
					
					// 期初计算
					for (int i = 1; i < vec1.size(); i++) {
						String[] values = (String[]) vec1.get(i);
						if(values[16].equals(String.valueOf(j+1))){
							double productMonthMoney = 0;
							double productMonthCount = 0;
							double productInCount = 0;
							double productInMoney = 0;
							double productOutCount = 0;
							double productOutMoney = 0;
							double monthEndCount = 0;
							double monthEndMoney = 0;
							productMonthCount = Double.parseDouble(values[1]);
							productMonthMoney = Double.parseDouble(values[2]);
	
							productInCount = Double.parseDouble(values[3]);
							productInMoney = Double.parseDouble(values[4]);
	
							productOutCount = Double.parseDouble(values[5]);
							productOutMoney = Double.parseDouble(values[6]);
	
							monthEndCount = Double.parseDouble(values[7]);
							monthEndMoney = Double.parseDouble(values[8]);
							// 創建一行
							tRow = tSheet.createRow((short) (index + 1));
							createCell(tWb, tRow, (short) 0, values[0]);
							createCell(tWb, tRow, (short) 1, values[9] == null ? "" : values[9]);
							createCell(tWb, tRow, (short) 2, values[10] == null ? "" : values[10]);
							createCell(tWb, tRow, (short) 3, values[11] == null ? "" : values[11]);
							createCell(tWb, tRow, (short) 4, values[12] == null ? "" : values[12]);
							createCell(tWb, tRow, (short) 5, values[13] == null ? "" : values[13]);
							createCell(tWb, tRow, (short) 6, values[14] == null ? "" : values[14]);
							createCell(tWb, tRow, (short) 7, StringUtil.showCount(values[15]));
							createCell(tWb, tRow, (short) 8, StringUtil.showCount(String.valueOf(productMonthCount)));
							createCell(tWb, tRow, (short) 9, StringUtil.showPrice(String.valueOf(productMonthMoney)));
							createCell(tWb, tRow, (short) 10, StringUtil.showCount(String.valueOf(productInCount)));
							createCell(tWb, tRow, (short) 11, StringUtil.showPrice(String.valueOf(productInMoney)));
							createCell(tWb, tRow, (short) 12, StringUtil.showCount(String.valueOf(productOutCount)));
							createCell(tWb, tRow, (short) 13, StringUtil.showPrice(String.valueOf(productOutMoney)));
							createCell(tWb, tRow, (short) 14, StringUtil.showCount(String.valueOf(monthEndCount)));
							createCell(tWb, tRow, (short) 15, StringUtil.showPrice(String.valueOf(monthEndMoney)));
							createCell(tWb, tRow, (short) 16, pt.ProviderName==null?"":pt.ProviderName);
							totalInCount += productInCount;
							totalInMoney += productInMoney;
							totalOutCount += productOutCount;
							totalOutMoney += productOutMoney;
							totalMonthStorageCount += productMonthCount;
							totalMonthStorageMoney += productMonthMoney;
							totalMonthEndCount += monthEndCount;
							totalMonthEndMoney += monthEndMoney;
							index++;
						}
					}
					
				}
				
				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 5);
					HSSFCell cell_1 = tRow.createCell((short) 8);
					HSSFCell cell_2 = tRow.createCell((short) 9);
					HSSFCell cell_3 = tRow.createCell((short) 10);
					HSSFCell cell_4 = tRow.createCell((short) 11);
					HSSFCell cell_5 = tRow.createCell((short) 12);
					HSSFCell cell_6 = tRow.createCell((short) 13);
					HSSFCell cell_7 = tRow.createCell((short) 14);
					HSSFCell cell_8 = tRow.createCell((short) 15);
					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);
					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);
					zongjiCell.setCellValue("合计:");
					cell_1.setCellValue(StringUtil.showCount(String.valueOf(totalMonthStorageCount)));
					cell_2.setCellValue(StringUtil.showPrice(String.valueOf(totalMonthStorageMoney)));
					cell_3.setCellValue(StringUtil.showCount(String.valueOf(totalInCount)));
					cell_4.setCellValue(StringUtil.showPrice(String.valueOf(totalInMoney)));
					cell_5.setCellValue(StringUtil.showCount(String.valueOf(totalOutCount)));
					cell_6.setCellValue(StringUtil.showPrice(String.valueOf(totalOutMoney)));
					cell_7.setCellValue(StringUtil.showCount(String.valueOf(totalMonthEndCount)));
					cell_8.setCellValue(StringUtil.showPrice(String.valueOf(totalMonthEndMoney)));
				}
			}
			
			/** 输出EXCEL文件 开始 */
			fileName = fileName + ".xls";
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();
			tWb.write(out);
			/** 输出EXCEL文件 结束 */
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * EXCEL，供应商结算分类报表
	 * @param vec
	 * @param month
	 * @param warehouseCode
	 * @param fileName
	 * @param start
	 * @param end
	 * @param request
	 * @param response
	 */
	private void writeExcel_ReportProviderProductTypeAll(List vec, String month,
			String warehouseCode, String fileName, String start, String end,
			HttpServletRequest request, HttpServletResponse response) {
		DBConnection con = null;
		ServletOutputStream out = null;
		boolean parent = false;
		/* 循环形参vec 结构<List>(1:String[2],2.3.4...:String[15]) */
		int size;
		if (vec == null) {
			size = 0;
		} else {
			size = vec.size();
		}
		HSSFWorkbook tWb = new HSSFWorkbook();
		HSSFSheet tSheet = null;
		try {
			for (int k = 0; k < size; k++) {
				List list = (List) vec.get(k);
				String[] warehouseObject = (String[]) list.get(0);
				String name = warehouseObject[1] + "(" + warehouseObject[0]
						+ ")";
				tSheet = tWb.createSheet();
				HSSFRow tRow = null;
				Region region = null;
				tSheet.setColumnWidth((short) 0, (short) (16 * 256));
				tSheet.setColumnWidth((short) 1, (short) (12 * 256));
				tSheet.setColumnWidth((short) 2, (short) (12 * 256));
				tSheet.setColumnWidth((short) 3, (short) (18 * 256));
				tSheet.setColumnWidth((short) 4, (short) (10 * 256));
				tSheet.setColumnWidth((short) 5, (short) (10 * 256));
				tSheet.setColumnWidth((short) 6, (short) (10 * 256));
				tSheet.setColumnWidth((short) 7, (short) (10 * 256));
				tSheet.setColumnWidth((short) 8, (short) (12 * 256));
				tSheet.setColumnWidth((short) 9, (short) (14 * 256));
				tSheet.setColumnWidth((short) 10, (short) (14 * 256));
				tSheet.setColumnWidth((short) 11, (short) (14 * 256));
				tSheet.setColumnWidth((short) 12, (short) (14 * 256));
				tSheet.setColumnWidth((short) 13, (short) (14 * 256));
				tWb.setSheetName(k, name, HSSFCell.ENCODING_UTF_16);
				HSSFFont font = tWb.createFont();
				font.setFontHeightInPoints((short) 9);
				font.setFontName("宋体");
				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				HSSFCellStyle cStyle = tWb.createCellStyle();
				cStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				HSSFCellStyle cStyleM = tWb.createCellStyle();
				cStyleM.setAlignment(HSSFCellStyle.ALIGN_CENTER);
				cStyleM.setFont(font);

				HSSFCellStyle cStyleM_R = tWb.createCellStyle();
				cStyleM_R.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
				cStyleM_R.setFont(font);
				// 标题行
				tRow = tSheet.createRow((short) 0);
				HSSFCell c0 = createCell(tWb, tRow, (short) 4, name
						+ "供应商结算分类累计汇总(仓库分类)");
				c0.setCellStyle(cStyleM);
				// 日期行
				tRow = tSheet.createRow((short) 1);
				region = new Region(1, (short) 4, 1, (short) 8);
				tSheet.addMergedRegion(region);
				createCell(tWb, tRow, (short) 4, "统计日期:" + start + " 至 " + end,
						HSSFCellStyle.ALIGN_CENTER, false);
				// 表头行
				tRow = tSheet.createRow((short) 2);
				HSSFCell c1 = createCell(tWb, tRow, (short) 0, "供应商结算分类");
				HSSFCell c2 = createCell(tWb, tRow, (short) 1, "期初金额");
				HSSFCell c3 = createCell(tWb, tRow, (short) 2, "购入");
				HSSFCell c4 = createCell(tWb, tRow, (short) 3, "盘盈");
				HSSFCell c5 = createCell(tWb, tRow, (short) 4, "入库合计");
				HSSFCell c6 = createCell(tWb, tRow, (short) 5, "领用");
				HSSFCell c7 = createCell(tWb, tRow, (short) 6, "盘亏");
				HSSFCell c8 = createCell(tWb, tRow, (short) 7, "出库合计");
				HSSFCell c9 = createCell(tWb, tRow, (short) 8, "结存");
				c1.setCellStyle(cStyleM_R);
				c2.setCellStyle(cStyleM_R);
				c3.setCellStyle(cStyleM_R);
				c4.setCellStyle(cStyleM_R);
				c5.setCellStyle(cStyleM_R);
				c6.setCellStyle(cStyleM_R);
				c7.setCellStyle(cStyleM_R);
				c8.setCellStyle(cStyleM_R);
				c9.setCellStyle(cStyleM_R);
				short index = 2; // 当前所在行号

				/** 总信息 */
				double totalMonthMoney = 0;
				double totalInMoney1 = 0;
				double totalInMoney2 = 0;
				double totalAllInMoney = 0;
				double totalOutMoney1 = 0;
				double totalOutMoney2 = 0;
				double totalAllOutMoney = 0;
				double totalMoney = 0;

				con = DBConnection.open(false);
				List newVec = splitProductType(list);
				// 缺少为空验证
				int sizeAll = newVec.size();
				// 总集合
				for (int i = 0; i < sizeAll; i++) {
					List subVec = (List) newVec.get(i);
					int sizeSub = subVec.size();
					// 子类集合
					WarehouseCategory wc = null;

					/** 小记信息 */
					double monthMoneyCateCount = 0;
					double productInMoney1CateCount = 0;
					double productInMoney2CateCount = 0;
					double productInMoney3CateCount = 0;
					double productOutMoney1CateCount = 0;
					double productOutMoney2CateCount = 0;
					double productOutMoney3CateCount = 0;
					double allMoneyCateCount = 0;

					for (int j = 0; j < sizeSub; j++) {

						/** 行信息 */
						double monthMoney = 0;
						double productInMoney1 = 0;
						double productInMoney2 = 0;
						double productInMoney3 = 0;
						double productOutMoney1 = 0;
						double productOutMoney2 = 0;
						double productOutMoney3 = 0;
						double allMoney = 0;
						// 缺少为空验证
						// 单一行
						String[] values = (String[]) subVec.get(j);

						monthMoney = Double.parseDouble(values[2]);
						productInMoney1 = Double.parseDouble(values[4]);
						productInMoney2 = Double.parseDouble(values[5]);
						productInMoney3 = Double.parseDouble(values[6]);
						productOutMoney1 = Double.parseDouble(values[8]);
						productOutMoney2 = Double.parseDouble(values[9]);
						productOutMoney3 = Double.parseDouble(values[10]);
						allMoney = Double.parseDouble(values[12]);
						
						String productType = "";
						if(values[0].equals("1")){
							productType = "I";
						}else if(values[0].equals("2")){
							productType = "II";
						}else if(values[0].equals("3")){
							productType = "III";
						}else {
							productType = "IV";
						}
						tRow = tSheet.createRow((short) (index + 1));
						createCell(tWb, tRow, (short) 0, productType);
						createCell(tWb, tRow, (short) 1, StringUtil
								.showPrice(String.valueOf(monthMoney)));
						createCell(tWb, tRow, (short) 2, StringUtil
								.showPrice(String.valueOf(productInMoney1)));
						createCell(tWb, tRow, (short) 3, StringUtil
								.showPrice(String.valueOf(productInMoney2)));
						createCell(tWb, tRow, (short) 4, StringUtil
								.showPrice(String.valueOf(productInMoney3)));
						createCell(tWb, tRow, (short) 5, StringUtil
								.showPrice(String.valueOf(productOutMoney1)));
						createCell(tWb, tRow, (short) 6, StringUtil
								.showPrice(String.valueOf(productOutMoney2)));
						createCell(tWb, tRow, (short) 7, StringUtil
								.showPrice(String.valueOf(productOutMoney3)));
						createCell(tWb, tRow, (short) 8, StringUtil
								.showPrice(String.valueOf(allMoney)));

						monthMoneyCateCount += monthMoney;
						productInMoney1CateCount += productInMoney1;
						productInMoney2CateCount += productInMoney2;
						productInMoney3CateCount += productInMoney3;
						productOutMoney1CateCount += productOutMoney1;
						productOutMoney2CateCount += productOutMoney2;
						productOutMoney3CateCount += productOutMoney3;
						allMoneyCateCount += allMoney;

						index++;
						if (j + 1 == sizeSub) {
							tRow = tSheet.createRow((short) (index + 1));
							if (parent == true) {
								HSSFCell zongjiCell = tRow
										.createCell((short) 0);
								HSSFCell cell_1 = tRow.createCell((short) 1);
								HSSFCell cell_2 = tRow.createCell((short) 2);
								HSSFCell cell_3 = tRow.createCell((short) 3);
								HSSFCell cell_4 = tRow.createCell((short) 4);
								HSSFCell cell_5 = tRow.createCell((short) 5);
								HSSFCell cell_6 = tRow.createCell((short) 6);
								HSSFCell cell_7 = tRow.createCell((short) 7);
								HSSFCell cell_8 = tRow.createCell((short) 8);

								zongjiCell.setCellStyle(cStyleM_R);
								cell_1.setCellStyle(cStyleM_R);
								cell_2.setCellStyle(cStyleM_R);
								cell_3.setCellStyle(cStyleM_R);
								cell_4.setCellStyle(cStyleM_R);
								cell_5.setCellStyle(cStyleM_R);
								cell_6.setCellStyle(cStyleM_R);
								cell_7.setCellStyle(cStyleM_R);
								cell_8.setCellStyle(cStyleM_R);

								zongjiCell
										.setEncoding(HSSFCell.ENCODING_UTF_16);

								zongjiCell.setCellValue(wc.getCategoryName()
										+ "    小计:");
								cell_1.setCellValue(StringUtil.showPrice(String
										.valueOf(monthMoneyCateCount)));
								cell_2.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney1CateCount)));
								cell_3.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney2CateCount)));
								cell_4.setCellValue(StringUtil.showPrice(String
										.valueOf(productInMoney3CateCount)));
								cell_5.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney1CateCount)));
								cell_6.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney2CateCount)));
								cell_7.setCellValue(StringUtil.showPrice(String
										.valueOf(productOutMoney3CateCount)));
								cell_8.setCellValue(StringUtil.showPrice(String
										.valueOf(allMoneyCateCount)));
							}
							totalMonthMoney += monthMoneyCateCount;
							totalInMoney1 += productInMoney1CateCount;
							totalInMoney2 += productInMoney2CateCount;
							totalAllInMoney += productInMoney3CateCount;
							totalOutMoney1 += productOutMoney1CateCount;
							totalOutMoney2 += productOutMoney2CateCount;
							totalAllOutMoney += productOutMoney3CateCount;
							totalMoney += allMoneyCateCount;
							index++;
						}
					}
				}

				// 总计行
				if (index > 2) {
					tRow = tSheet.createRow((short) (index + 2));
					HSSFCell zongjiCell = tRow.createCell((short) 0);
					HSSFCell cell_1 = tRow.createCell((short) 1);
					HSSFCell cell_2 = tRow.createCell((short) 2);
					HSSFCell cell_3 = tRow.createCell((short) 3);
					HSSFCell cell_4 = tRow.createCell((short) 4);
					HSSFCell cell_5 = tRow.createCell((short) 5);
					HSSFCell cell_6 = tRow.createCell((short) 6);
					HSSFCell cell_7 = tRow.createCell((short) 7);
					HSSFCell cell_8 = tRow.createCell((short) 8);

					zongjiCell.setCellStyle(cStyleM_R);
					cell_1.setCellStyle(cStyleM_R);
					cell_2.setCellStyle(cStyleM_R);
					cell_3.setCellStyle(cStyleM_R);
					cell_4.setCellStyle(cStyleM_R);
					cell_5.setCellStyle(cStyleM_R);
					cell_6.setCellStyle(cStyleM_R);
					cell_7.setCellStyle(cStyleM_R);
					cell_8.setCellStyle(cStyleM_R);

					zongjiCell.setEncoding(HSSFCell.ENCODING_UTF_16);

					zongjiCell.setCellValue("合计：");
					cell_1.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMonthMoney)));
					cell_2.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney1)));
					cell_3.setCellValue(StringUtil.showPrice(String
							.valueOf(totalInMoney2)));
					cell_4.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllInMoney)));
					cell_5.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney1)));
					cell_6.setCellValue(StringUtil.showPrice(String
							.valueOf(totalOutMoney2)));
					cell_7.setCellValue(StringUtil.showPrice(String
							.valueOf(totalAllOutMoney)));
					cell_8.setCellValue(StringUtil.showPrice(String
							.valueOf(totalMoney)));

				}
			}
			fileName = fileName + ".xls";
			response.setHeader("Cache-Control", "No-cache");
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
			response.setDateHeader("Expires", 0);
			response.setContentType("application/ms-excel");
			response.addHeader("Content-disposition", "filename=" + fileName);
			out = response.getOutputStream();

			tWb.write(out);

			out.flush();
			out.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception ex1) {

			}
		}
	}
}
